這可能是一個超級結點的問題,道歉。我試圖在PHP中實現一種效果,我從PHP中獲得了這種效果,PHP正在爲私有屬性構建getter和setter函數。Python 2.7版:如何建立的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
拋出Error AttributeError:'newClass' object has no attribute '__var'
也是理所當然的,它沒有。如何構建getter和setter函數來訪問私有屬性?
UPDATE:
我已經離開了原來的問題,因爲它似乎對新來Python的學習,他們可能會不小心將帶來其約定從其他語言了一些有益的。但實際上,我最初的問題有點不同,試圖讓這個問題更籠統,我混淆了我的實際需要。因此,這裏的修正案:
其實我不是用私有屬性的工作;實際上,我正在試圖通過構圖環境向下傳遞屬性。即:
Class A
作爲一個屬性,有一個Class B
對象不會從Class A
繼承。這幾乎是從來沒有的情況下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的異端。 爲什麼?
在做這件事之前,你應該問自己兩個問題:1)你爲什麼使用私有屬性? 2)你爲什麼使用getter/setter函數?這兩個都不是Pythonic,通常有更好的方法來完成Python中的任務。第三個問題是,不是檢查是否設置了變量,而是應該始終將其初始設置爲某個默認值,然後檢查該變量而不是檢查它是否「已設置」。 – BrenBarn 2013-04-24 19:39:16
不,它不會;這段代碼會拋出一個'SyntaxError',因爲'__init__'沒有'def'。即使在那裏,'__var'也不會拋出一個屬性錯誤,因爲它是像引用一樣的[mangled](http://docs.python.org/2/reference/expressions.html#atom-identifiers)在'__init__'中。 – 2013-04-24 19:39:36
請注意,在python中沒有真正的私有變量...... – 2013-04-24 19:44:05