作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在作为一个包含类和子类的应用程序工作。对于每个类,包括父类(super class)和子类,都有一个名为 label
的类变量。我希望父类(super class)的 label
变量默认为类名。例如:
class Super():
label = 'Super'
class Sub(Super):
label = 'Sub'
与其手动输入每个类的变量,不如从父类(super class)中的类名派生变量并自动为子类填充它?
class Super():
label = # Code to get class name
class Sub(Super)
pass
# When inherited Sub.label == 'Sub'.
这样做的原因是这将是默认行为。我还希望,如果我可以获得默认行为,我可以稍后通过指定备用 label
来覆盖它。
class SecondSub(Super):
label = 'Pie' # Override the default of SecondSub.label == 'SecondSub'
我试过使用 __name__
,但它不起作用,只是给我 '__main__'
。
我想在@classmethod
方法中使用类变量label
。所以我希望能够引用该值而不必实际创建 Super() 或 Sub() 对象,如下所示:
class Super():
label = # Magic
@classmethod
def do_something_with_label(cls):
print(cls.label)
最佳答案
您可以在标签中返回 self.__class__.__name__
作为属性
class Super:
@property
def label(self):
return self.__class__.__name__
class Sub(Super):
pass
print Sub().label
或者你可以在 __init__
方法中设置它
def __init__(self):
self.label = self.__class__.__name__
这显然只适用于实例化的类
要在类方法中访问类名,您只需在 cls
上调用 __name__
class XYZ:
@classmethod
def my_label(cls):
return cls.__name__
print XYZ.my_label()
这个解决方案也可能有效(从 https://stackoverflow.com/a/13624858/541038 截取)
class classproperty(object):
def __init__(self, fget):
self.fget = fget
def __get__(self, owner_self, owner_cls):
return self.fget(owner_cls)
class Super(object):
@classproperty
def label(cls):
return cls.__name__
class Sub(Super):
pass
print Sub.label #works on class
print Sub().label #also works on an instance
class Sub2(Sub):
@classmethod
def some_classmethod(cls):
print cls.label
Sub2.some_classmethod()
关于Python 类名作为类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30382005/
我是一名优秀的程序员,十分优秀!