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

Php Python2.7:如何构建getter/setter函数来访问类属性而无需继承?,php,python,oop,getter,getter-setter,Php,Python,Oop,Getter,Getter Setter,抱歉,这可能是个非常重要的问题。我试图用PHP中我熟悉的Python实现一种效果,它为私有属性构建getter和setter函数 在PHP中,我通常会执行以下操作: <?php class newClass() { private $var = null; function newClass($initVal) { //init } public function get($var) { if ( isset($this-

抱歉,这可能是个非常重要的问题。我试图用PHP中我熟悉的Python实现一种效果,它为私有属性构建getter和setter函数

在PHP中,我通常会执行以下操作:

<?php
class newClass() {
    private $var = null;

    function newClass($initVal) {
        //init
    }

    public function get($var) {
        if ( isset($this->$var) ) {
            return $this->$var;
        }
    }
}
?>
抛出一个错误
AttributeError:“newClass”对象没有属性“\uu var”

但事实并非如此。如何构建getter和setter函数来访问私有属性


更新:

我留下了最初的问题,因为对于Python新手来说,了解他们可能无意中提出的来自其他语言的约定似乎很有用。但实际上,我最初的问题有点不同,在试图使问题更一般化时,我混淆了我的实际需要。这是一项修正案:

事实上,我并不是在用私人属性工作;事实上,我正在尝试通过构图环境向下传递属性。即:

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

我可以构建
类B
,使其始终拥有这些信息,但这意味着我几乎总是在浪费时间和内存(尽管可能很琐碎)。要使其具体化,请想象:

牙刷
具有
刷毛
刷毛
可以在用户提供首选刷牙体验的情况下,创建适合“软”或“硬”牙刷的刷毛数量。但是,如果用户没有提供,那么我希望
刷毛
询问
刷子
的表面积,让它猜测平均值应该是多少

我想到了这一点,尽管我直觉上认为Python程序员会因此而恨我;我只想了解为什么:

@staticmethod
def request(self, var):
    appIndex = self.__dict__
    if appIndex[var]:
        return appIndex[var]

print Class.request(instance, var)

工作起来很有魅力,但我认为这是Python的异端。为什么?

您要搜索的是:

输出:

in the setter: 
in the getter: 
2

您正在搜索的是:

输出:

in the setter: 
in the getter: 
2

首先,Python没有私有变量。你指的是名字——弄脏。其目的是在导入模块时防止名称冲突。每当您在前面有两个UnunderScore的类中编写变量时,类的名称就会添加到它的前面。因此,更可取的做法是将变量命名为“
\uuuu var\uuu
”,这是python“私有”事物的定制


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

首先,Python没有私有变量。你指的是名字——弄脏。其目的是在导入模块时防止名称冲突。每当您在前面有两个UnunderScore的类中编写变量时,类的名称就会添加到它的前面。因此,更可取的做法是将变量命名为“
\uuuu var\uuu
”,这是python“私有”事物的定制


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

在这样做之前,你应该问自己两个问题:1)为什么要使用私有属性?2) 为什么要使用getter/setter函数?这两种方法都不是很适合Python,通常有更好的方法用Python完成任务。第三个问题是,与检查变量是否已设置不同,您应该始终首先将其设置为某个默认值,然后检查该值,而不是检查它是否已设置;此代码将抛出一个
SyntaxError
,因为
\uuuu init\uuuu
没有
def
。即使存在这种情况,
\uuuu var
也不会抛出属性错误,因为它与
\uuu init\uuuu
中的引用类似。请记住,在python中没有真正的私有变量…@MartijnPieters是的,你是对的,但这确实不是问题所在,很明显,我使用了一种问题的一般形式来遵循stackoverflow惯例,即对每个人都有用。因此,感谢您指出了一个非常非常明显且琐碎的问题,这个问题不可能抛出我在问题中实际提到的错误,但是,尽管我是python新手,但我确实知道如何定义函数。但是,嘿,你肯定找到我了,很好的工作代码警察。@Jonline:你说代码会抛出
AttributeError
,我对此有意见,因为它没有。我试着运行你的代码来验证我没有看错。您正在询问有关特定代码段的问题,因此也许您应该测试代码,说明该代码的功能。在执行此操作之前,您应该问自己两个问题:1)为什么要使用私有属性?2) 为什么要使用getter/setter函数?这两种方法都不是很适合Python,通常有更好的方法用Python完成任务。第三个问题是,与检查变量是否已设置不同,您应该始终首先将其设置为某个默认值,然后检查该值,而不是检查它是否已设置;此代码将抛出一个
SyntaxError
,因为
\uuuu init\uuuu
没有
def
。前夕
in the setter: 
in the getter: 
2