我想我错过了一些明显的东西,但是当我使用装饰器时,我无法得到方法的名称。当我运行此代码时,我收到错误:
AttributeError: 'str' object has no attribute "__name__"
有人能告诉我如何获得这些装饰方法的名称吗?
谢谢
def Print(*arg, **kwarg):
func, *arguments = arg
print(func.__name__ + "(): {}".format(func=arguments[0]))
class Bob(object):
def __init__(self):
pass
@property
def stuff(self):
return "value from stuff property"
@stuff.setter
def stuff(self, noise):
return noise
class Tester:
def __init__(self):
self.dylan = Bob()
def randomTest(self):
Print(self.dylan.stuff, 1)
if __name__ == "__main__":
whatever = Tester()
whatever.randomTest()
stuff
不是一种功能或方法;这是一个属性。语法
@property
def stuff(...):
...
使用property
作为stuff
的参数创建property
类的实例,相当于
def stuff(...):
....
stuff = property(stuff)
正如你所见,property
的实例没有__name__
属性。
(这对于setter来说有点棘手,因为函数和属性必须具有相同的名称。但是将stuff
定义为“第二”时间不会覆盖名为stuff
的现有属性。)
可以通过property
的属性访问各个方法。
>>> Bob.stuff.fget.__name__
'stuff'
>>> Bob.stuff.fset.__name__
'stuff'
请注意另一种更长的方法来创建相同的属性:
class Bob:
def stuff_getter(self):
...
def stuff_setter(self, noise):
...
stuff = property(stuff_getter, stuff_setter)
del stuff_getter, stuff_setter # Clean up the namespace