1

这可能是一个超级小问题,抱歉。我试图在 Python 中实现我熟悉的 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;
        }
    }
}
?>

但是,在 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 函数来访问私有属性?


更新:

我留下了最初的问题,因为对于 Python 的新手来说,了解他们可能不小心提出的其他语言的哪些约定似乎很有用。但实际上,我最初的问题有点不同,在试图使问题更普遍时,我混淆了我的实际需求。所以这里有一个修正:

事实上,我并没有使用私有属性。事实上,我正在处理试图通过组合环境向下传递属性。IE:

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 的异端。为什么?

4

2 回答 2

10

您正在寻找的是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
于 2013-04-24T19:39:21.770 回答
-1

嗯,首先,Python 没有私有变量。您指的是名称修改。目的是在导入模块时防止名称冲突。每当您在一个类中编写一个前面有两个非下划线的变量时,该类的名称就会添加到它的前面。因此,最好将变量命名为“ __var__”,这是python“私有”事物的自定义。

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

于 2013-04-24T19:44:20.677 回答