솔루션 : __get__(self, instance, instance_type)
:
는 지금까지 내가 아는 한, 기술자들이 클래스 또는 인스턴스에 대한 호출하는 경우 때문에 __get__
함수 서명의, 구별 할 수있는 유일한 개체입니다. 이 속성을 사용하면 스위치를 위에 올려 놓을 수 있습니다.
class boundmethod(object):
def __init__(self, cls_method=None, instance_method=None, doc=None):
self._cls_method = cls_method
self._instance_method = instance_method
if cls_method:
self._method_name = cls_method.__name__
elif instance_method:
self._method_name = instance_method.__name__
if doc is None and cls_method is not None:
doc = cls_method.__doc__
self.__doc__ = doc
self._method = None
self._object = None
def _find_method(self, instance, instance_type, method_name):
for base in instance_type.mro()[1:]:
method = getattr(base, method_name, None)
if _is_descriptor(method):
method = method.__get__(instance, base)
if method and method is not self:
try:
return method.__func__
except AttributeError:
return method
def __get__(self, instance, instance_type):
if instance is None:
self._method = self._cls_method or self._find_method(instance, instance_type, self._method_name)
self._object = instance_type
else:
self._method = self._instance_method or self._find_method(instance, instance_type, self._method_name)
self._object = instance
return self
@staticmethod
def cls_method(obj=None):
def constructor(cls_method):
if obj is None:
return boundmethod(cls_method, None, cls_method.__doc__)
else:
return type(obj)(cls_method, obj._instance_method, obj.__doc__)
if isinstance(obj, FunctionType):
return boundmethod(obj, None, obj.__doc__)
else:
return constructor
@staticmethod
def instance_method(obj=None):
def constructor(instance_method):
if obj is None:
return boundmethod(None, instance_method, instance_method.__doc__)
else:
return type(obj)(obj._cls_method, instance_method, obj.__doc__)
if isinstance(obj, FunctionType):
return boundmethod(None, obj, obj.__doc__)
else:
return constructor
def __call__(self, *args, **kwargs):
if self._method:
try:
return self._method(self._object, *args, **kwargs)
except TypeError:
return self._method(*args, **kwargs)
return None
예 :
>>> class Walkmen(object):
... @boundmethod.cls_method
... def start(self):
... return 'Walkmen start class bound method'
... @boundmethod.instance_method(start)
... def start(self):
... return 'Walkmen start instance bound method'
>>> print Walkmen.start()
Walkmen start class bound method
>>> print Walkmen().start()
Walkmen start instance bound method
가 나는 너희들 O를 몇 가지 도움이되기를 바랍니다.
최고.
답변과 솔루션 부분을 게시하시기 바랍니다. – Gabriel
SO (http://stackoverflow.com/documentation)의 문서 섹션에 게시 할 수 있습니다. 또는 문제 구역에만 질문을 제한하고 솔루션 섹션 –
으로 직접 대답 할 수 있습니다. @utsav_deep - 문제에 대한 제 대답을 어떻게 제한합니까? 거기에 어떤 옵션이 있습니까? 죄송합니다 멍청한 질문에 대한 이러한 StackOverflow 내 첫 단계입니다. –