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

问题描述 投票:1回答:1

我想我错过了一些明显的东西,但是当我使用装饰器时,我无法得到方法的名称。当我运行此代码时,我收到错误:

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()
python python-3.x
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.