为什么在这种情况下没有__name__工作? AttributeError引发

时间:2016-03-29 21:55:00

标签: python python-3.x attributes

我是编程的新手,所以当我想要一个命令将硬编码函数的名称变成一个字符串时,我查了一下并开始使用内置的__name__函数。问题是,我不认为我理解__name__如何检索想要的名字。我知道它与local()或dir()当前可见的内容有关,但是关于它...(我自己对这个主题的研究对我来说有点难以理解)作为一个结果,我偶然发现了一个我不知道如何解决的错误。

以下是一些重新创建错误的代码:

class Abc:
    @staticmethod
    def my_static_func():
        return

    def my_method(self):
        return

    class_list = [my_static_func]
    method_list = [my_method]

#These calls work
Abc.my_static_func.__name__
Abc.my_method.__name__
Abc.method_list[0].__name__

#But This call raises an AttributeError
Abc.class_list[0].__name__

我收到此错误消息:

AttributeError: 'staticmethod' object has no attribute '__name__'

那么为什么当我将静态方法放入列表然后尝试从列表中获取函数的名称时它不起作用?如果这个问题愚蠢,请原谅我。正如您可以清楚地看到的那样,我不了解__name__如何运作的基本原则(以及我甚至不知道甚至会给这些主题命名的其他内容!)。答案会很好,但也欢迎提及一些文档。

1 个答案:

答案 0 :(得分:2)

使用此代码

@staticmethod
def my_static_method(...):
    ....

函数my_static_method包含在staticmethod中。当你从一个类中访问staticmethod时,staticmethod会发生一些神奇的事情,你实际上会得到一个合适的函数。这就是为什么你可以访问它的__name__

staticmethod放入列表并从该列表中访问它可以防止魔法发生,并且您可以获得staticmethod个对象。

Abc.my_static_func  # this is a function
Abc.class_list[0]   # this is a staticmethod object

由于staticmethod没有__name__,您在访问AttibuteError时会收到__name__

要解决您的问题,您可以从staticmethod

获取基础功能
Abc.class_list[0].__func__           # the function
Abc.class_list[0].__func__.__name__  # its name

要了解有关从类/对象访问属性/方法时发生的“魔法”的更多信息,请查看descriptors