Python 2.7:如何构建getter/setter函数来访问没有继承的类属性?

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的异端邪说.为什么?

Sam*_*uns 9

你要搜索的是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)