[英]Python - Updating Child Attributes with a Base Class Method
我花了一天時間試圖找到這個問題的答案,但卻沒有提出任何問題。
假設我有幾個類,每個類都包含一個與其他類相同的方法。
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,以說明我想要做的事情。
有沒有辦法消除重復代碼,也許有一個抽象類如下?
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)
我希望能夠以這樣的方式從藍色變為紅色,這樣我就不必在每個A
和B
類中定義相同的方法
exampleA.set_color("red")
但是這不像我預期的那樣工作,它不會改變exampleA.__color
的值
你不能。 __private
風格屬性的重點在於它們是私有的。 基類,子類,局外人,其他人都無法看到或修改它們。 如果基類或子類嘗試,它們最終將在實例上創建自己的私有屬性,完全獨立於您的屬性。
如果您不想這樣,請不要使用__private
style屬性。
那么,你應該怎么做?
好吧,最Pythonic的事情就是使用公共屬性,完全廢棄你的getter和setter: exampleA.color = 'red'
。
如果你有一個很好的理由需要隱藏屬性,也許你想讓它們_private
而不是__private
,這意味着它們只是按慣例隱私,所以你的代碼將按原樣工作。 但同樣,我懷疑你真的需要隱藏它們。
如果你真的,真的需要__private
成員,但仍然真的需要打敗__private
成員的整個目的......好吧,在那種情況下,我撒了謊; 你實際上可以通過手動修改名稱來訪問它們。 例如,這是命名的屬性__color
從內部類A
名為_A__color
從類以外的A
。
如果您想知道為什么Python會讓您違反__private
保護......那么,與Java中的類似功能不同,這並不是為了保護您免受其他人的惡意代碼攻擊。 它保護你的是這樣的場景:你用一個屬性__x
寫一個A
類。 我寫了一個帶有__x
屬性的B
類。 其他人通過從兩者繼承來組成我們的類,而不告訴你或我。 我的代碼仍然有效,您的代碼也是如此。
唯一的原因是它不能完全正常工作,因為你正在使用前綴為__
屬性,這使得它們“私有”,因此父類無法訪問。 不要那樣做:只使用普通的屬性名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.