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には、プライベート変数などはないことに注意してください。一般に、クラスメンバーの前にアンダースコアが付いている場合は、それを台無しにしないでください(もちろん、何をしているのかを理解している場合を除きます)。プレフィックスに2つのアンダースコアが付いている場合、名前マングリングが呼び出され、クラス外へのアクセスが困難になります。これは、継承での名前空間の衝突を防ぐために使用されます(これらの変数も、通常、混乱することはありません)。