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)
我希望能够以这样的方式从蓝色变为红色,这样我就不必在每个类中定义相同的方法A,B
exampleA.set_color("red")
Run Code Online (Sandbox Code Playgroud)
但这并没有像我预期的那样工作,它不会改变exampleA.__color
你不能。-style 属性的全部要点__private是它们是私有的。基类、子类、外人,没有其他人可以看到或修改它们。如果基类或子类尝试,它们最终将在实例上创建自己的私有属性,完全独立于您的私有属性。
如果您不想这样,就不要使用__private-style 属性。
那你该怎么办?
\n\n好吧,最 Pythonic 的事情就是只使用公共属性,并完全废弃你的 getter 和 setter exampleA.color = \'red\':。
如果您有充分的理由需要隐藏这些属性,也许您想制作它们_private而不是__private,这意味着它们仅按照惯例是私有的,因此您的代码将按原样工作。但我再次怀疑你是否真的需要隐藏它们。
如果你真的非常需要__private成员,但仍然需要击败__private成员\xe2\x80\xa6\xc2\xa0的全部目的,那么,在这种情况下,我撒了谎;您实际上可以通过手动修改名称来访问它们。__color例如,从类内部命名的属性A是_A__color从类外部命名的A。
如果您想知道为什么 Python 让您违反保护__private...那么,与 Java 中的类似功能不同,这并不是为了保护您免受其他人的恶意代码的侵害。它可以保护您免受以下情况的影响:您编写一个A带有属性的类__x。B我写了一个带有属性的类__x。其他人通过继承两者来组成我们的类,而无需告诉你或我。我的代码仍然有效,你的也一样。
有关更多信息,请参阅有关私有变量的教程部分和有关标识符的参考文档。
\n| 归档时间: |
|
| 查看次数: |
1793 次 |
| 最近记录: |