Pythonは、クラス属性、インスタンス属性、およびプロパティをサポートしています。 MyClassのがどのように実装されるかを認識していないユーザー、A、Bへ属性やプロパティを初期化するにはどうしたらいいですか?
from time import ctime, sleep
class MyClass(object):
A = ctime() # class attribute
def __init__(self):
self.B = ctime() # instance attribute
self._C = None
@property
def C(self): # property
if self._C is None:
self._C = ctime()
return self._C
@C.setter
def C(self, c):
self._C
、およびCは同様の挙動を示す:
sleep(2)
myObject = MyClass()
sleep(2)
print myObject.A # prints time module was initialized
print myObject.B # prints time instance was created, 2 sec later
print myObject.C # prints time this line was called, 2 sec later
myObject.A = 'foo' # myObject.A is now an instance attribute
myObject.B = 'foo' # myObject.B is still an instance attribute
myObject.C = 'foo' # myObject.C is still an (instance) property
print myObject.A # prints 'foo'
print myObject.B # prints 'foo'
print myObject.C # prints 'foo'
私がここに来たの答えから、私は次のことを理解:初めてmyObject.A
が印刷され、myObject.A
がmyObject.__Class__.A
であることがMyClass.A
である。 2回目のmyObject.A
はmyObject.__Class__.A
ではありません。ファイン。
上記の例では、ctime()
は、A、B、およびCがどのように異なるかを説明するためだけに使用されていました。今、私たちが代わりに不変定数を使用している、と仮定します。
class MyClass(object):
A = 'bar' # class attribute
def __init__(self):
self.B = 'meta' # instance attribute
self._C = None
@property
def C(self): # property
if self._C is None:
self._C = 'foobar'
return self._C
@C.setter
def C(self, c):
self._C = c
myObject = MyClass()
myObject.A
はまだクラス属性MyClass.A
で、myObject.B
は、インスタンス属性であるとmyObject.C
が財産である間。それらのすべては、私が欲しいものを正確に行います。彼らはデフォルト値を持っており、私は他の値を割り当てることができます。どののスタイルを使うべきですか?A、B、C?
実際には、両方とも「機能しません」。彼らは両方とも同じことをしません。 'foo.A'は実際に**既存の' Foo.A'クラス変数の前にあるインスタンス変数を作成します**。 「どのスタイルを使うべきか」は、あなたの目的が何であるかに全面的に依存します。インスタンス変数やクラス変数が必要ですか?質問にあなたの目標を含めてください。 –