这可能是一个 super 小问题,抱歉。我正在尝试在 Python 中实现我熟悉的 PHP 效果,它正在为私有(private)属性构建 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 函数来访问私有(private)属性?
更新:
我离开了原来的问题,因为对于 Python 的新手来说,了解他们可能不小心提出的其他语言的哪些约定似乎很有用。但实际上,我最初的问题有点不同,为了使问题更普遍,我混淆了我的实际需求。所以这里有一个修正案:
事实上,我并没有使用私有(private)属性;事实上,我正在尝试通过组合环境向下传递属性。即:
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 的异端邪说。 为什么?
请您参考如下方法:
您要搜索的是 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
