문제
메타클래스를 사용하여 클래스에 인스턴스 메서드를 어떻게 추가합니까(예, 메타클래스를 사용해야 합니다)?다음과 같은 종류의 작업이 가능하지만 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 이상에서만 할당 가능합니다.
제휴하지 않습니다 StackOverflow