В Python 2.7 я хотел бы украсить метод экземпляра test
в классе Foo
с помощью декоратора, который также является классом с именем FooTestDecorator
. Из вопроса пользователя Chirstop и документа Python 2 Руководство по использованию дескриптора Я создал этот пример.
Однако, похоже, есть проблема: когда я печатаю свой декорированный объект метода, его (проверенное?) имя неверно, потому что оно отмечено как вопросительный знак, например Foo.?
.
import types
class FooTestDecorator(object):
def __init__(self,func):
self.func=func
self.count=0
# tried self.func_name = func.func_name, but seemed to have no effect
def __get__(self,obj,objtype=None):
return types.MethodType(self,obj,objtype)
def __call__(self,*args,**kwargs):
self.count+=1
return self.func(*args,**kwargs)
class Foo:
@FooTestDecorator
def test(self,a):
print a
def bar(self,b):
print b
если вы проверите это:
f=Foo()
print Foo.__dict__['test']
print Foo.test
print f.test
print Foo.__dict__['bar']
print Foo.bar
print f.bar
ты получаешь
<__main__.FooTestDecorator ...object...>
<unbound method Foo.?>
<bound method Foo.? of ...instance...>
<function bar at 0x...>
<unbound method Foo.bar>
<bound method Foo.bar of ...instance...>
Вы можете видеть, что метод замены показан как Foo.?
. Это кажется неправильным.
Как мне правильно получить метод экземпляра, декорированный классом?
примечание: моя причина в том, что я хочу использовать переменные из экземпляра FooDecorator
self
, которые я бы установил при инициализации. Я не включил это в пример, чтобы упростить его.