我想我缺少明显的东西,但是当我使用装饰器时我无法获得方法的名称。运行此代码时,出现错误:
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()
答案 0 :(得分:1)
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
答案 1 :(得分:0)
def Print(*arg, **kwarg):
func, *arguments = arg
print(func.__name__ + "(): {}".format(func=arguments[0]))
class Bob():
def __init__(self, s):
self.stuff = s
@property
def myStuff(self):
return self.stuff
@myStuff.setter
def setStuff(self, noise):
self.stuff = noise
class Tester:
def __init__(self):
self.dylan = Bob(1)
def randomTest(self):
print(self.dylan.stuff)
if __name__ == "__main__":
whatever = Tester()
whatever.randomTest()
这应该有效:)