의 우리가 클래스와 그 방법을 포장, 새로운 클래스의 몸을 산책 메타 클래스 CallableWrappingMeta
, InstanceMethodWrapper
있어 가정 해 봅시다 :. 그들이에서 와서instancemethod로 호출 할 수 있습니까?
import types
class CallableWrappingMeta(type):
def __new__(mcls, name, bases, cls_dict):
for k, v in cls_dict.iteritems():
if isinstance(v, types.FunctionType):
cls_dict[k] = InstanceMethodWrapper(v)
return type.__new__(mcls, name, bases, cls_dict)
class InstanceMethodWrapper(object):
def __init__(self, method):
self.method = method
def __call__(self, *args, **kw):
print "InstanceMethodWrapper.__call__(%s, *%r, **%r)" % (self, args, kw)
return self.method(*args, **kw)
class Bar(object):
__metaclass__ = CallableWrappingMeta
def __init__(self):
print 'bar!'
우리의 더미 래퍼 그냥 인수를 인쇄를하지만 눈에 띄는 것이 있습니다 :이 메서드는 인스턴스 객체 수신기를 통과하지 못합니다. 왜냐하면 InstanceMethodWrapper
이 호출 가능하기는하지만 클래스 작성 중에 인스턴스 메소드로 변환 될 목적으로 함수로 처리되지 않기 때문입니다 (메타 클래스가 그것으로 끝났다).
해결 방법 가능한 해결책은 클래스 대신 데코레이터를 사용하여 메서드를 래핑하는 것입니다.이 메서드는 인스턴스 메서드가됩니다. 그러나 현실 세계에서는 InstanceMethodWrapper
이 훨씬 더 복잡합니다. API를 제공하고 메소드 호출 이벤트를 게시합니다. 수업이 더 편리합니다. (더 많은 성과를 거두지 않아도됩니다.)
나는 또한 막 다른 골목을 시도했다. 서브 클래스 types.MethodType
및 types.UnboundMethodType
은 어디에도 없었습니다. 조금 내성적이며, 그들은 type
에서 탈퇴 한 것으로 보입니다. 그래서 저는이 두 가지를 모두 메타 클래스로 사용하려했지만 거기에서도 운이 없었습니다. 그들이 메타 클래스로서 특별한 요구를하는 경우일지도 모르지만,이 시점에서 우리는 문서화되지 않은 영역에있는 것 같습니다.
아이디어가 있으십니까?
더 자세히 설명해 주시겠습니까? 나는 너가하고있는 것을 이해하는 데 어려움을 겪고있다. – Unknown