Skip to main content
 首页 » 编程设计

php之python 2.7 : How to build getter/setter functions to access class attributes without inheritance

2025年05月04日28mengfanrong

这可能是一个 super 小问题,抱歉。我正在尝试在 Python 中实现我熟悉的 PHP 效果,它正在为私有(private)属性构建 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 函数来访问私有(private)属性?


更新:

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

事实上,我并没有使用私有(private)属性;事实上,我正在尝试通过组合环境向下传递属性。即:

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

请您参考如下方法:

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