【发布时间】:2011-07-15 17:27:32
【问题描述】:
是否可以在类定义的主体中获取类名?
例如,
class Foo():
x = magic() # x should now be 'Foo'
我知道我可以使用类方法在类主体之外静态地执行此操作:
class Bar():
@classmethod
def magic(cls):
print cls.__name__
Bar.magic()
但这不是我想要的,我想要类体中的类名
【问题讨论】:
-
这在 Python 2 中是不可能的,但是 Python 3 中元类的
__prepare__方法允许您在类的主体开始执行之前将名称添加到类字典中(从您然后可以使用它) -
您能描述一下您想如何使用它吗?这本身似乎有点毫无意义,因为您可以编写 Foo.__name__ 而不是 magic()。在某些情况下,可能会有更好的解决方案。
-
@Rosh Oxymoron,我认为这是可能的,它可能不是优雅或高性能或你想要的,但只要你可以在运行时修改 AST,你可以做任何你想做的事情。 .
-
@Rosh Oxymoron:请参阅下面我提出的解决方案;)
-
@phkahler:我有很多子类,我想静态地(在导入时)执行一些初始化方法,以从需要子类名称的超类中设置一些静态变量。我不希望将子类名称作为这些方法的输入的代码重复。我需要在拥有类实例之前完成此设置。另外,我不想使用@classmethod 进行初始化,因为我必须在某个地方调用类方法。
标签: python metaprogramming python-2.x