我花了一天的时间试图找到这个问题的答案,但什么也没找到。在
假设我有几个类,每个类都包含一个与其他类相同的方法。在
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}$我想用这种方式从蓝色变成红色
这样我就不必在每个类A
和B
中定义相同的方法
exampleA.set_color("red")
但这并不像我预期的那样工作,它没有改变exampleA.__color
的值
你不能,
__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的参考文档。在
唯一的原因是你使用了前缀为
__
的属性,这使得它们是“私有的”,因此不能被父类访问。不要这样做:只需使用普通属性名。在相关问题 更多 >
编程相关推荐