使用类属性和子类的类方法

时间:2016-10-21 09:23:18

标签: python class methods attributes

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不使用应用于真实类(子类)的类方法?

你有解决方案吗?感谢。

1 个答案:

答案 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。