[英]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 A
的Class 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.