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

Python 2.7: How to build getter/setter functions to access class attributes without inheritance?

这可能是一个超级裸体问题,抱歉。我正试图在我熟悉的Python中从PHP中获得一种效果,它正在为私有属性构建getter和setter函数。

在PHP中,我通常会这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class newClass() {
    private $var = null;

    function newClass($initVal) {
        //init
    }

    public function get($var) {
        if ( isset($this->$var) ) {
            return $this->$var;
        }
    }
}
?>

但是,在python中尝试同样的想法:

1
2
3
4
5
6
7
8
9
10
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的人来说,从他们可能无意中提出的其他语言中学习哪些约定似乎很有用。但实际上,我最初的问题有点不同,在试图使问题更普遍的时候,我混淆了我的实际需要。所以这里有一个修正案:

事实上,我没有处理私有属性;事实上,我正在处理如何通过组合环境向下传递属性。IE:

Class A作为一个属性,有一个不从Class A继承的Class B对象。Class B几乎不需要来自Class A的任何信息,但在我的项目中,有一种情况是,如果用户选择不向Class B提供信息,则会有一个声明试图推断出合理的解决方案,但它需要来自Class A的信息,通常情况下,我会不需要。

我可以构建Class B来一直拥有这些信息,但这意味着我几乎总是在浪费时间和记忆(尽管可能是微不足道的)。要使其具体化,请想象一下:

toothbrushbristlesbristles可以,只要用户提供首选的刷牙体验,创建一个适合"软"或"硬"刷的刷毛数量。但是,如果用户不提供,那么我想让bristlesbrush询问它的表面积,让它可以猜测平均值应该是多少。

我想到了这一点,尽管我有一种直觉,那就是Python程序员会因此而讨厌我;我只是想理解为什么:

1
2
3
4
5
6
7
@staticmethod
def request(self, var):
    appIndex = self.__dict__
    if appIndex[var]:
        return appIndex[var]

print Class.request(instance, var)

很有魅力,但我认为这是Python异端。为什么?


你要找的是properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)

输出:

1
2
3
in the setter:
in the getter:
2


首先,python没有私有变量。你所指的是名字——马格林。目的是在导入模块时防止名称冲突。每当你在一个前面有两个下划线的类中编写一个变量时,该类的名称就会添加到它的前面。因此,最好将变量命名为"EDOCX1"(1),这是Python"private"事物的定制。

另一方面,在Python中,如果希望一些ON能够设置和获取变量,通常只允许直接访问(与Java或其他语言不同)是最有意义的。