Python2.7:如何构建getter/setter函数来访问类属性而不继承?

2024-05-17 18:52:08 发布

您现在位置:Python中文网/ 问答频道 /正文

抱歉,这可能是个非常关键的问题。我试图用我熟悉的Python实现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;
        }
    }
}
?>

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

事实上,我并没有处理私有属性;事实上,我正在处理试图通过组合环境向下传递属性的问题。即:

Class A作为属性,有一个不从Class A继承的Class B对象。几乎从来没有过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异端。为什么?


Tags: 用户self信息returnif属性vardef
2条回答

首先,Python没有私有变量。你所指的是名字-乱糟糟的。其目的是在导入模块时防止名称冲突。每当你在一个前面有两个未理解的变量的类中编写变量时,类的名称就会被添加到它的前面。因此,最好将变量命名为“__var__”,这是python“私有”事物的定制。

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

你要找的是^{}

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

相关问题 更多 >