簡體   English   中英

Python - 使用基類方法更新子屬性

[英]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)

我希望能夠以這樣的方式從藍色變為紅色,這樣我就不必在每個AB類中定義相同的方法

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM