Python - 使用基类方法更新子属性

Nik*_*Nik 2 python inheritance abstract-class object-oriented-analysis

我花了一天的时间试图找到这个问题的答案,但一无所获。

假设我有几个类,每个类都包含与其他类相同的方法。

class A:
    def __init__(self, attr1, attr2, color):
        self.__attr1 = attr1
        self.__attr2 = attr2
        self.__color = color

    def set_color(self, color):
        self.__color = color

class B:
    def __init__(name, attr3, attr4, color):
         self.__attr3 = attr3
         self.__attr4 = attr4
         self.__color = color

    def set_color(self, color):
        self.__color = color
Run Code Online (Sandbox Code Playgroud)

在此示例中,相同的方法被简化为只有一个相同的方法 set_color,以说明我正在尝试执行的操作。

有没有办法消除重复代码,也许使用如下抽象类?

class Parent:
    def set_color(self, color):
        self.__color = color

class A(Parent):
    def __init__(self, attr1, attr2, color):
        self.__attr1 = attr1
        self.__attr2 = attr2
        self.__color = color


class B(Parent):
    def __init__(name, attr3, attr4, color):
         self.__attr3 = attr3
         self.__attr4 = attr4
         self.__color = color

exampleA = A(attr1, attr2, "blue)
Run Code Online (Sandbox Code Playgroud)

我希望能够以这样的方式从蓝色变为红色,这样我就不必在每个类中定义相同的方法AB

exampleA.set_color("red")
Run Code Online (Sandbox Code Playgroud)

但这并没有像我预期的那样工作,它不会改变exampleA.__color

aba*_*ert 5

你不能。-style 属性的全部要点__private是它们是私有的。基类、子类、外人,没有其他人可以看到或修改它们。如果基类或子类尝试,它们最终将在实例上创建自己的私有属性,完全独立于您的私有属性。

\n\n

如果您不想这样,就不要使用__private-style 属性。

\n\n

那你怎么办?

\n\n

好吧,最 Pythonic 的事情就是只使用公共属性,并完全废弃你的 getter 和 setter exampleA.color = \'red\':。

\n\n

如果您有充分的理由需要隐藏这些属性,也许您想制作它们_private而不是__private,这意味着它们仅按照惯例是私有的,因此您的代码将按原样工作。但我再次怀疑你是否真的需要隐藏它们。

\n\n

如果你真的非常需要__private成员,但仍然需要击败__private成员\xe2\x80\xa6\xc2\xa0的全部目的,那么,在这种情况下,我撒了谎;您实际上可以通过手动修改名称来访问它们。__color例如,从类内部命名的属性A_A__color从类外部命名的A

\n\n

如果您想知道为什么 Python 让您违反保护__private...那么,与 Java 中的类似功能不同,这并不是为了保护您免受其他人的恶意代码的侵害。它可以保护您免受以下情况的影响:您编写一个A带有属性的类__xB我写了一个带有属性的类__x。其他人通过继承两者来组成我们的类,而无需告诉你或我。我的代码仍然有效,你的也一样。

\n\n

有关更多信息,请参阅有关私有变量的教程部分和有关标识符的参考文档。

\n