在Python类的实例方法中,我知道我们可以通过以下方式获取类名self.__class__.__name__
但是,我想将类的名称存储在类变量中,而不对类的名称进行编码。
我知道我可以这样做来将类的名称放入类变量中:
class MyClass(object):
pass
MyClass._myname = MyClass.__name__
但是,我必须对字符串进行编码MyClass
在类定义之外两次,只是为了将类名放入类变量中。在这种情况下,那就是"MyClass"
,我可以简单地编码如下:
class MyClass(object):
_myname = "MyClass"
但即使这样也是多余的,因为我必须硬编码"MyClass"
内MyClass
class.
我想要的是以某种方式将类的名称放入类变量中,而不需要对类的名称进行编码,如下所示:
class MyClass(object):
_myname = ???? # where ???? is a statement which returns the class
# name, in which the string "MyClass" does not appear
这可能吗?
你可以使用装饰器
>>> def autoname(cls):
... cls._MyName=cls.__name__
... return cls
...
>>> @autoname
... class check:
... pass
...
>>> check._MyName
'check'
>>>
或者,如果您不想硬编码属性的名称:
>>> def autoname2(name):
... def autoname(cls):
... setattr(cls, name, cls.__name__)
... return cls
... return autoname
...
>>> @autoname2('_StoreHere')
... class check2:
... pass
...
>>> check2._StoreHere
'check2'
>>>
当然,第二种形式可以带更多参数,例如:
>>> def autoname3(name, f=lambda x: x):
... def autoname(cls):
... setattr(cls, name, f(cls.__name__))
... return cls
... return autoname
...
>>> @autoname3('_MyNameIs', lambda x: x.upper() + '_The_Bold')
... class check3:
... pass
...
>>> check3._MyNameIs
'CHECK3_The_Bold'
>>>
关于装饰器与元类的注释:元类非常酷,但是,如果不是严格需要它们,最好避免使用它们,因为臭名昭著元类冲突.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)