使用装饰器时无法获取方法名称

时间:2019-03-22 11:48:11

标签: python python-3.x

我想我缺少明显的东西,但是当我使用装饰器时我无法获得方法的名称。运行此代码时,出现错误:

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()

2 个答案:

答案 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()

这应该有效:)