今日もPythonのお勉強。
今日はclassステートメントからやる。
classステートメント
クラスオブジェクトを生成する。
書式は以下な感じ。
class <name>(superclass,...):
data = value
def method(self, ...):
localValue = value1
self.member = value2
1行目
クラス名(name)へのクラスオブジェクトの代入
2行目
クラス属性(data)の生成、クラス属性への代入
3行目
メソッド名(method)へのメソッドの代入
4行目
methodメソッドのローカル変数への代入
5行目
インスタンス属性(member)への代入。
となっている。
1行目の()内にスーパークラスを列挙する。無い場合には()自体書かない。
クラス属性にアクセスするには、
<クラス名>.<クラス属性名>
<クラスオブジェクト>.<クラス属性名>
のように指定する。
1番目の方法を実際にやってみると、
>>> class C1:
... X = [1,2,3,4]
...
>>> C1.X
[1, 2, 3, 4]
>>>
といった感じ。
2番目の方法を実際にやってみると、
>>> a = C1
>>> a.X
[1, 2, 3, 4]
な感じか。
2番目の方は、クラスオブジェクトを「呼び出し」ているわけでは無いので、
クラスオブジェクトへのリファレンスがコピーされている模様。
現に、
>>> a.X = []
>>> C1.X
[]
>>>
となっている。
書式の5行目はインスタンス属性となる。インスタンス属性なのでクラスオブジェクトには影響しない。
また別のインスタンスオブジェクトにも影響しない。
で、やってみる。
>>> class C1:
... def method(self, x):
... self.X = x
...
>>> i1 = C1()
>>> i2 = C1()
>>> i1.method(10)
>>> i1.X
10
>>> i2.X
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: C1 instance has no attribute 'X'
>>> i2.method(20)
>>> i2.X
20
>>> i1.X
10
>>> C1.X
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: class C1 has no attribute 'X'
>>>
ふーん。
そもそもクラスオブジェクトにインスタンス属性は持たせられないので、
「インスタンス属性なのでクラスオブジェクトには影響しない。」は確かめようが無い。
へー。
おしまい。
.
0 コメント:
コメントを投稿