gpt4 book ai didi

Python 类名作为类变量

转载 作者:行者123 更新时间:2023-11-28 19:34:02 27 4
gpt4 key购买 nike

我正在作为一个包含类和子类的应用程序工作。对于每个类,包括父类(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/

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