这可能是一个超级结点的问题,道歉。我试图在PHP中实现一种效果,我从PHP中获得了这种效果,PHP正在为私有属性构建getter和setter函数。Python 2.7版:如何建立的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
抛出Error AttributeError:'newClass' object has no attribute '__var'
也是理所当然的,它没有。如何构建getter和setter函数来访问私有属性?
UPDATE:
我已经离开了原来的问题,因为它似乎对新来Python的学习,他们可能会不小心将带来其约定从其他语言了一些有益的。但实际上,我最初的问题有点不同,试图让这个问题更笼统,我混淆了我的实际需要。因此,这里的修正案:
其实我不是用私有属性的工作;实际上,我正在试图通过构图环境向下传递属性。即:
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的异端。 为什么?
在做这件事之前,你应该问自己两个问题:1)你为什么使用私有属性? 2)你为什么使用getter/setter函数?这两个都不是Pythonic,通常有更好的方法来完成Python中的任务。第三个问题是,不是检查是否设置了变量,而是应该始终将其初始设置为某个默认值,然后检查该变量而不是检查它是否“已设置”。 – BrenBarn 2013-04-24 19:39:16
不,它不会;这段代码会抛出一个'SyntaxError',因为'__init__'没有'def'。即使在那里,'__var'也不会抛出一个属性错误,因为它是像引用一样的[mangled](http://docs.python.org/2/reference/expressions.html#atom-identifiers)在'__init__'中。 – 2013-04-24 19:39:36
请注意,在python中没有真正的私有变量...... – 2013-04-24 19:44:05