문제

메타클래스를 사용하여 클래스에 인스턴스 메서드를 어떻게 추가합니까(예, 메타클래스를 사용해야 합니다)?다음과 같은 종류의 작업이 가능하지만 func_name은 여전히 ​​"foo"입니다.

def bar(self):
    print "bar"

class MetaFoo(type):
    def __new__(cls, name, bases, dict):
        dict["foobar"] = bar
        return type(name, bases, dict)

class Foo(object):
    __metaclass__ = MetaFoo

>>> f = Foo()
>>> f.foobar()
bar
>>> f.foobar.func_name
'bar'

내 문제는 일부 라이브러리 코드가 실제로 func_name을 사용하고 나중에 Foo 인스턴스의 'bar' 메서드를 찾지 못한다는 것입니다.나는 할 수있을 것이다:

dict["foobar"] = types.FunctionType(bar.func_code, {}, "foobar")

type.MethodType도 있지만 이를 사용하려면 아직 존재하지 않는 인스턴스가 필요합니다.여기서 뭔가를 놓치고 있는 걸까요?

도움이 되었습니까?

해결책

mro를 활용할 수 있는 방식으로 베이스를 동적으로 확장해 보세요. 메소드는 실제 메소드입니다.

class Parent(object):
    def bar(self):
        print "bar"

class MetaFoo(type):
    def __new__(cls, name, bases, dict):
        return type(name, (Parent,) + bases, dict)

class Foo(object):
    __metaclass__ = MetaFoo

if __name__ == "__main__":
    f = Foo()
    f.bar()
    print f.bar.func_name

다른 팁

내 생각에 당신이 하고 싶은 일은 이것이다.

>>> class Foo():
...   def __init__(self, x):
...     self.x = x
... 
>>> def bar(self):
...   print 'bar:', self.x
... 
>>> bar.func_name = 'foobar'
>>> Foo.foobar = bar
>>> f = Foo(12)
>>> f.foobar()
bar: 12
>>> f.foobar.func_name
'foobar'

이제 패스하셔도 무방합니다 Foo기대하는 도서관으로 Foo 이름이 지정된 메소드를 갖는 인스턴스 foobar.

안타깝게도 (1) ​​메타클래스를 사용하는 방법을 모르고 (2) 귀하의 질문을 올바르게 읽었는지 잘 모르겠지만 이것이 도움이 되기를 바랍니다.

참고하세요 func_name Python 2.4 이상에서만 할당 가능합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top