Jon*_*ine 1 php python oop getter getter-setter
这可能是一个超级问题,道歉.我正在尝试在PHP中实现一个效果我熟悉PHP,它正在为私有属性构建getter和setter函数.
在PHP中,我通常会这样做:
<?php
class newClass() {
private $var = null;
function newClass($initVal) {
//init
}
public function get($var) {
if ( isset($this->$var) ) {
return $this->$var;
}
}
}
?>
Run Code Online (Sandbox Code Playgroud)
但是,在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
Run Code Online (Sandbox Code Playgroud)
引发错误 AttributeError:'newClass' object has no attribute '__var'
而且非常正确,事实并非如此.如何构建getter和setter函数来访问私有属性?
更新:
我已经离开了原来的问题,因为对于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)
Run Code Online (Sandbox Code Playgroud)
像魅力一样,但我认为这是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)
Run Code Online (Sandbox Code Playgroud)
输出:
in the setter:
in the getter:
2
Run Code Online (Sandbox Code Playgroud)