【发布时间】:2023-09-04 11:56:01
【问题描述】:
这可能是一个超级小问题,抱歉。我正在尝试在 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 新手来说似乎很有用,可以了解他们可能不小心引入的其他语言的哪些约定。但实际上,我最初的问题有点不同,在试图使问题更普遍时,我混淆了我的实际需求。所以这里有一个修正:
事实上,我并没有使用私有属性;事实上,我正在处理试图通过组合环境向下传递属性。即:
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 的异端邪说。 为什么?
【问题讨论】:
-
在做这件事之前你应该问自己两个问题:1)你为什么要使用私有属性? 2) 你为什么使用 getter/setter 函数?这两者都不是非常 Pythonic,通常有更好的方法可以在 Python 中完成您的任务。第三个问题是,不要检查变量是否已设置,而应始终将其初始设置为某个默认值,然后检查它而不是检查它是否“已设置”。
-
不,不会的;这段代码将抛出一个
SyntaxError,因为__init__没有def。即使存在,__var也不会引发属性错误,因为它与__init__中的引用一样是 mangled。 -
请记住,在 python 中没有真正的私有变量这样的东西......
-
@MartijnPieters 是的,你是对的,但这真的不是问题,我真的很明显使用问题的一般形式来遵循关于对每个人有用的 * 约定。所以,感谢您指出这个非常非常明显和微不足道的问题,它不可能抛出我在问题中实际提到的错误,但是,虽然我是 python 新手,但我确实知道如何定义一个函数。但是,嘿,你肯定得到了我,好工作代码警察。
-
@Jonline:你声称代码会抛出
AttributeError我有问题,因为它没有。我试图运行你的代码来验证我没有读错。你问的是关于一段特定代码的问题,所以也许你应该测试代码,说明该代码的作用?
标签: php python oop getter getter-setter