Php Python2.7:如何构建getter/setter函数来访问类属性而无需继承?
抱歉,这可能是个非常重要的问题。我试图用PHP中我熟悉的Python实现一种效果,它为私有属性构建getter和setter函数 在PHP中,我通常会执行以下操作: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
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