gpt4 book ai didi

python - 在不输入类名的情况下将类名存储在类变量中?

转载 作者:太空宇宙 更新时间:2023-11-03 12:55:56 25 4
gpt4 key购买 nike

在 python 类的实例方法中,我知道我们可以通过 self.__class__.__name__

获取类名

但是,我想将类的名称存储在类变量中,而无需对类的名称进行编码。

我知道我可以这样做来将类的名称放入类变量中:

class MyClass(object):
pass
MyClass._myname = MyClass.__name__

但是,我必须在类定义之外对字符串 MyClass 进行两次编码,只是为了将类名放入类变量中。在这种情况下,这将是 "MyClass",我可以简单地编写如下代码:

class MyClass(object):
_myname = "MyClass"

但即使这样也是多余的,因为我必须在 MyClass 类中对 "MyClass" 进行硬编码。

我想要的是以某种方式将类的名称放入类变量中,而无需对类的名称进行编码,如下所示:

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'
>>>

关于装饰器与元类的说明:元类非常酷,但是,如果不是严格需要它们,最好避免使用它们,因为臭名昭著的 metaclass conflicts .

关于python - 在不输入类名的情况下将类名存储在类变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42381749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com