在 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__:previous posts 讨论得很好。
请注意,在 python 中没有私有变量之类的东西。一般来说,在一个类成员的前缀下划线,你不应该弄乱它(除非你当然知道你在做什么)。如果它带有 2 个下划线前缀,它将调用名称修改,这使得在类外部访问变得更加困难。这用于防止继承中的命名空间冲突(并且这些变量通常也不会被弄乱)。