在 python 中,应该使用 a 来实现这样的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
在这个例子中,最好这样做(正如爱德华所指出的):
class Foo(object):
def __init__(self):
self.x = None
因为我们的 getter/setter 方法实际上并没有做任何事情......但是,当 setter/getter 实际上做的不仅仅是分配/返回属性的值时,属性变得非常有用。
它也可以使用__setattr__
/来实现__getattr__
(但不应该以这种方式实现,因为如果你的类有超过 1 个属性,它很快就会变得很麻烦。我也猜想这样做会比使用属性慢):
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中没有私有变量之类的东西。一般来说,在一个类成员的前缀下划线,你不应该弄乱它(除非你当然知道你在做什么)。如果它带有 2 个下划线前缀,它将调用名称修改,这使得在类外部访问变得更加困难。这用于防止继承中的命名空间冲突(并且这些变量通常也不会被弄乱)。