簡體   English   中英

Python 2.7:如何構建getter / setter函數以訪問類屬性而無需繼承?

[英]Python 2.7: How to build getter/setter functions to access class attributes without inheritance?

抱歉,這可能是一個超級小題。 我正在嘗試在PHP熟悉的Python中實現效果,該Python正在為私有屬性構建getter和setter函數。

在PHP中,我通常會這樣做:

<?php
class newClass() {
    private $var = null;

    function newClass($initVal) {
        //init
    }

    public function get($var) {
        if ( isset($this->$var) ) {
            return $this->$var;
        }
    }
}
?>

但是,在Python中嘗試相同的想法:

class newClass():
    def __init__(self, initVal):
        self.__nameOfVar1 = initVal
        self.__nameOfVar2 = initVal


    def get(self, var):
                #assuming, when called, var = nameOfVar1
        if self.__var:
            return self.__var

引發錯誤AttributeError:'newClass' object has no attribute '__var'

確實如此,事實並非如此。 如何構建getter和setter函數以訪問私有屬性?


更新:

我離開了最初的問題,因為對於Python的新手來說,學習它們可能偶然提出的來自其他語言的約定似乎很有用。 但實際上,我最初的問題有些不同,為了使問題更籠統,我混淆了我的實際需求。 所以這是一個修正:

實際上,我不是在處理私有屬性。 實際上,我正在嘗試通過合成環境將屬性向下傳遞。 即:

Class A作為屬性具有不繼承自Class AClass B對象。 Class B幾乎永遠不會需要Class A任何信息,但是在我的項目中,有一種情況是,如果用戶選擇不向Class B提供信息,則有一條語句試圖進行最后的推斷。一個合理的解決方案,但它需要Class A通常不需要的信息。

我可以將Class B構建為始終具有該信息,但這意味着幾乎總是我在浪費時間和內存(盡管可能很瑣碎)。 為了使這個具體,想象一下:

toothbrush具有bristles ,並且bristles可以提供的用戶提供了一個優選的刷洗體驗,創建了一些適合於任一“軟”或“企業”的刷毛。 但是,如果用戶不提供此功能,那么我希望bristles詢問brush的表面積,以使其猜測平均數。

我想到了這一點,盡管我有直覺,Python程序員會討厭我。 我只想了解原因:

@staticmethod
def request(self, var):
    appIndex = self.__dict__
    if appIndex[var]:
        return appIndex[var]

print Class.request(instance, var)

就像一個魅力,但我認為這是Python的異端。 為什么?

您要搜索的是properties

class Foo():
    def __init__(self):
        self._spam = 0

    @property
    def spam(self):
        print("in the getter: ")
        return self._spam

    @spam.setter
    def spam(self, move):
        print("in the setter: ")
        self._spam = move + self._spam

f = Foo()
f.spam = 2
print(f.spam)

輸出:

in the setter: 
in the getter: 
2

好吧,首先,Python沒有私有變量。 您指的是名稱處理。 目的是防止導入模塊時發生名稱沖突。 每當您在類中使用前有兩個下划線的變量時,該類的名稱都會添加到該類的前面。 因此,更可取的是將變量“ __var__ ”命名為python“私有”事物的自定義變量。

但是,另一方面,在python中,如果希望某些對象能夠設置並獲取變量,則通常只允許直接訪問是最有意義的(與Java或其他語言不同)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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