정확히 무엇을 하려는지 Ruby에 대해 알 수는 없지만 __getattr__
방법을 확인하십시오. 클래스에서 정의한 경우 Python은 코드가 클래스의 다른 속성에 액세스하려고 시도 할 때이를 호출합니다. 메소드가되기를 원하기 때문에 반환하는 메소드를 즉석에서 작성해야합니다.
>>> class Product:
... def __init__(self, number):
... self.number = number
... def get_number(self):
... print "My number is %d" % self.number
... def __getattr__(self, attr_name):
... return lambda:"stubbed_"+attr_name
...
>>> p = Product(172)
>>> p.number
172
>>> p.name()
'stubbed_name'
>>> p.get_number()
My number is 172
>>> p.other_method()
'stubbed_other_method'
또한 존재하지 않는 속성에 대한 __getattr__
를 호출 __getattr__
요구에 하지이 클래스의 다른 정의되지 않은 속성을 사용, 그렇지 않으면 무한 재귀 않습니다.이것은 당신은 당신의 테스트 코드가 아닌 생산 코드에서하고 싶은 일 경우
... def __getattr__(self, attr_name):
... return self.x
>>> p.y
Traceback (most recent call last):
#clipped
RuntimeError: maximum recursion depth exceeded while calling a Python object
, 다음 다음 테스트 코드에 __getattr__
방법 (언 바운드)를 정의, 생산 코드 파일에 일반 클래스 정의를 넣어 한 다음 바인딩 클래스에 당신이 원하는 :
#production code
>>> class Product:
... def __init__(self, number):
... self.number = number
... def get_number(self):
... print "My number is %d" % self.number
...
#test code
>>> def __getattr__(self, attr):
... return lambda:"stubbed_"+attr_name
...
>>> p = Product(172)
>>> p.number
172
>>> p.name()
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
AttributeError: Product instance has no attribute 'name'
>>> Product.__getattr__ = __getattr__
>>> p.name()
'stubbed_name'
나는이 모두가 있는지 여부를 속성에 대한 __getattribute__
가 호출, __getattr__
반대로 이미 (__getattribute__
를 사용하여 한 클래스와 어떻게 반응하는지 모르겠어요 그들은 존재한다).
만 이미 존재하는 구체적인 방법에 대해이 작업을 수행하려면, 당신은 같은 것을 할 수있는 :
#production code
>>> class Product:
... def __init__(self, number):
... self.number = number
... def get_number(self):
... return self.number
...
>>> p = Product(172)
>>> p.get_number()
172
#test code
>>> def get_number(self):
... return "stub_get_number"
...
>>> Product.get_number = get_number
>>> p.get_number()
'stub_get_number'
을 또는 당신이 정말 우아하고 싶다면, 당신은 일을 만들 수있는 래퍼 함수를 만들 수 있습니다 쉽게 여러 방법 : 테스트는 매우 일반적이며, 파이썬에서 당신을 도울 수있는 도구가 많이있을 때 방법을 조롱 할 필요
#test code
>>> import functools
>>> def stubber(fn):
... return functools.wraps(fn)(lambda self:"stub_"+fn.__name__)
...
>>> Product.get_number = stubber(Product.get_number)
>>> p.get_number()
'stub_get_number'
"... 패치 된 클래스의 인스턴스의 방법에 반환 값을 구성하려면"파라의 시작에서의 docs에서 참조. 이것이 나의 유스 케이스를 만족 시키는가? –
그것은해야한다; 귀하의 유스 케이스는 귀하의 예와 거의 같습니다. 기본적으로 클래스에서 메소드의 정의를 변경하면 모든 인스턴스에서 메소드의 정의도 변경됩니다. 'classmethod' 함수는 기본적으로 함수를 메서드로 변환하는 래퍼를 생성하고'lambda'는 단순히 정적 문자열을 반환하는 함수를 정의합니다. – kindall
...하지만 내 편집을 참조하십시오. – kindall