我是编程的新手,所以当我想要一个命令将硬编码函数的名称变成一个字符串时,我查了一下并开始使用内置的__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__
如何运作的基本原则(以及我甚至不知道甚至会给这些主题命名的其他内容!)。答案会很好,但也欢迎提及一些文档。
答案 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