これらは両方とも機能します。
class A:
V = 3
def getV(self):
return self.V
def getVbis(self):
return A.V
print A().getV()
print A().getVbis()
どちらがよりpythonicですか?なんで?
これらは両方とも機能します。
class A:
V = 3
def getV(self):
return self.V
def getVbis(self):
return A.V
print A().getV()
print A().getVbis()
どちらがよりpythonicですか?なんで?
self.V
インスタンス変数A.V
の値を含み、クラス変数の値を含みます。クラス メソッドが V に対して何を行うか、およびどのように行うかによって、getV
さまざまgetVbis
なものが返されます。
次に例を示します。
class A:
V = 3
def getV(self):
return self.V
def getVbis(self):
return A.V
def setV(self, newVal):
self.V = newVal
aInst = A()
print aInst.getV()
print aInst.getVbis()
aInst.setV(5)
print aInst.getV()
print aInst.getVbis()
上記のコードの結果は次のようになります。
3
3
5
3
したがって、これはどちらがより Pythonic であるかということではないと思います。むしろ、クラス変数で何をしようとしているのかについてです。
コードの実際の意味にもかかわらず、ゲッター/セッターの方法はそれほどPythonicではないと思います。
まず、変数はデフォルトで public です。getter 関数を使用すると、より複雑になります。
第 2 に、getter/setter 関数に何らかの制約またはその他のロジックが必要な場合は、ロジックを示すよりわかりやすい名前を付ける必要があります。名前 getXXX は何の意味もありません。
ところで、変数に直接アクセスしたくない場合は、別のオプションがあります: http://docs.python.org/2/library/functions.html#property
私自身は、インスタンスメソッド内のインスタンスメソッドとしてクラスメンバー(属性とメソッド)にアクセスすることを好みます。それがよりPythonicであるかどうかはわかりませんが、クラスメンバーをインスタンスメンバーでいつでもオーバーライドできるため、インターフェイスに集中できます。この場合のクラスメンバーは、いくつかの有用なデフォルト(値、または実装)を提供します。
It might not be pretty, but I prefer:
self.__class__.V
This way you don't have to explicitly refer to the class name, which makes subclassing easier, and there is no danger of accidentally getting an instance attribute rather than a class attribute.