【问题标题】:class method using class attribute and subclasse使用类属性和子类的类方法
【发布时间】:2017-03-03 13:02:17
【问题描述】:
class Choices(object):
        __choices = set(["Boss"])

        @classmethod
        def choices(cls):
            return list(cls.__choices)

class ChoicesA(Choices):
     __choices = set(['A'])

>> ChoicesA.choices()

>> ['Boss']

但我想要['A']

为什么类方法不使用子类的类属性? 这不是python错误吗?为什么python不使用应用于真实类(子类)的类方法?

你有解决办法吗?谢谢。

【问题讨论】:

  • 谢谢。我不想修改父属性,而是修改子属性。但我想在父级中定义一次方法。
  • 我找到了解决办法:class Choices(object): _choices = set(["Boss"]) @classmethod def choices(cls): return list(cls._choices) class ChoicesA(Choices): _choices = set(['A'])

标签: python class methods attributes


【解决方案1】:

试试这个:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2021-03-13
    • 2011-03-24
    相关资源
    最近更新 更多