在Python中,类似这样的东西
应该使用一个
property
来实现(只有在它们做一些有用的事情时才需要这样做)。
class Foo(object):
def __init__(self):
self._x = None
@property
def x(self):
return self._x
@x.setter
def x(self,y):
self._x = y
在这个例子中,最好只是执行(正如Edward所指出的):
class Foo(object):
def __init__(self):
self.x = None
由于我们的getter/setter方法实际上什么也没做……但是,当setter/getter实际上执行的不仅仅是分配/返回属性值时,属性就会变得非常有用。
它也可以使用__setattr__
/__getattr__
实现(但如果您的类具有多个属性,则不应该以这种方式实现,因为它很快会变得麻烦。我还猜想,使用这种方式比使用属性更慢):
class Foo(object):
def __init__(self):
self._x = None
def __setattr__(self,attr,obj):
if(attr == 'x'):
object.__setattr__(self,'_x',obj)
else:
object.__setattr__(self,attr,obj)
def __getattr__(self,attr):
if(attr == 'x'):
return object.__getattr__(self,'_x')
else:
return object.__getattr__(self,attr)
就__setattr__
和__getattr__
的实际作用而言...
当你执行以下操作时,会调用__setattr__
/__getattr__
:
myclassinstance = MyClass()
myclassinstance.x = 'foo' #translates to MyClass.__setattr__(myclassinstance,'x','foo')
bar = myclassinstance.x #translates to bar=MyClass.__getattr__(myclassinstance,'x')
关于 __get__
和 __set__
:之前的文章已经很好地讨论了。(链接)
请注意,在Python中没有私有变量这种东西。通常情况下,如果一个类成员以一个下划线为前缀,则不应该对它进行更改(当然,除非你知道自己在做什么)。如果它以两个下划线为前缀,它将会被名称重整,这会使得在类外部更难访问。这用于防止继承中的命名空间冲突(并且这些变量通常也不应该被更改)。
setattr
/getattr
。 - mgilson