class Choices(object):
__choices = set(["Boss"])
@classmethod
def choices(cls):
return list(cls.__choices)
class ChoicesA(Choices):
__choices = set(['A'])
>> ChoicesA.choices()
>> ['Boss']
但我想要['A']
为什么类方法不使用子类中的class属性? 这不是python错误吗?为什么python不使用应用于真实类(子类)的类方法?
你有解决方案吗?感谢。
答案 0 :(得分:0)
试试这个:
class Choices(object):
choices_ = set(["Boss"])
@classmethod
def choices(cls):
return list(cls.choices_)
class ChoicesA(Choices):
choices_ = set(['A'])
>> ChoicesA.choices()
>> ['A']
您是否注意到了这一变化?
我刚公开选择(之前是私人选择)。
现在这里是解释:
当我们使用__choices时,在执行python之前会自动更改私有成员的名称。因此,A类中的__choices将成为_A__choices,而B类中的__choices将成为_B__choices。两个人都可以从儿童班进入。所以你的代码将被转换为:
class Choices(object):
_Choices__choices = set(["Boss"])
@classmethod
def choices(cls):
return list(cls._Choices__choices)
class ChoicesA(Choices):
_ChoicesA__choices = set(['A'])
你会得到['Boss']作为你的结果。
这样做只是为了避免子类覆盖父类的私有成员。实际上在python中没有什么是私有的,父类中的所有内容都将在子类中继承。
你可以试试这个:
print(ChoicesA._ChoicesA__choices) # ['A']
print(ChoicesA._Choices__choices) # ['Boss']
名称转换的概念称为mangling。