Python用基类方法更新子属性

2024-09-24 00:22:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我花了一天的时间试图找到这个问题的答案,但什么也没找到。在

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

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

在这个例子中,相同的方法被简化为一个相同的方法set_color来说明我要做的事情。在

有没有一种方法可以消除重复的代码,也许用下面的抽象类?在

^{pr2}$

我想用这种方式从蓝色变成红色 这样我就不必在每个类AB中定义相同的方法

exampleA.set_color("red")

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


Tags: 方法答案nameselfinitdef时间class
2条回答

你不能,__private-样式属性的全部意义在于它们是私有的。基类、子类、外部对象,没有人可以看到或修改它们。如果一个基类或子类尝试,它们最终会在实例上创建自己的自己的私有属性,完全独立于您的属性。在

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

那么,你应该怎么做?在

好吧,最具python风格的是只使用public属性,并完全废弃getter和setter:exampleA.color = 'red'。在

如果你有一个很好的理由需要隐藏这些属性,也许你想让它们_private而不是{},这意味着它们只是按照约定是私有的,所以你的代码就可以正常工作了。但我再次怀疑你真的需要把它们藏起来。在

如果你真的,真的需要__private成员,但仍然需要破坏__private成员的全部目的……那么,在这种情况下,我撒谎了;实际上,可以通过手动修改名称来访问它们。例如,在类A内部名为__color的属性从类A外部命名为_A__color。在

如果您想知道Python为什么允许您违反__private保护。。。好吧,与Java中类似的特性不同,这并不是为了保护您免受他人恶意代码的攻击。它保护您的是这样一个场景:编写一个带有属性__x的类A。我编写了一个带有属性__x的类B。其他人通过继承这两个类来组成我们的类,而不告诉你或我。我的代码仍然有效,你的代码也一样。在

有关更多信息,请参阅关于private variables的教程部分和关于identifiers的参考文档。在

唯一的原因是你使用了前缀为__的属性,这使得它们是“私有的”,因此不能被父类访问。不要这样做:只需使用普通属性名。在

相关问题 更多 >