メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2008年2月24日日曜日

[Python][お勉強] Python入門(59) - 新スタイルクラス

ビルトインオブジェクトを継承したクラスは新スタイルクラスとなる。
そうでは無いクラスはクラシッククラスという。

新スタイルクラスはPython2.2で導入されたもの。



新スタイルクラスとクラシッククラスの違い

  • オブジェクトツリーの検索順が違う
  • 新スタイルクラスではスタティックメソッド、クラスメソッドが使用できる
  • 新スタイルクラスでは__slots__属性が使用できる。
  • 新スタイルクラスでは「プロパティ」を使用することができる。
  • 新スタイルクラスでは__getattribute__メソッドを使用することができる。

オブジェクトツリーの検索順
クラシッククラスの場合

class A: pass
class B(A): pass
class C(A): pass
class D(B): pass
class E(C): pass
class F(D, E): pass

a = F()
print a.X
 

とあった場合、変数Xを探す順番は、

① クラスF
② クラスD
③ クラスB
④ クラスA
⑤ クラスE
⑥ クラスC
 

となるらしい。
つまり、上下優先

新スタイルクラスの場合

class A(object): pass
class B(A): pass
class C(A): pass
class D(B): pass
class E(C): pass
class F(D, E): pass

a = F()
print a.X



とあった場合、変数Xの検索順は

①クラスF
②クラスD
③クラスE
④クラスB
⑤クラスA
⑥クラスC
 

となるらしい。
つまり左右優先


この辺は要注意。



スタティックメソッドとクラスメソッド
スタティックメソッドは、第一引数にインスタンスオブジェクトを渡さずに、
ほぼ通常の関数のように使用できるメソッド。
クラスメソッドは、第一引数にクラスを渡すことができるメソッド。

Python2.2以降であれば、クラシッククラスにも持たせることができるとのこと。
具体例は載っていないので良くわからない。


__slots__
インスタンスに持たせるインスタンス属性を特定のものに限定するのに使用する。
__slots__があるとインスタンスには指定された属性しかもてなくなる。


>>> class C1(object):
... __slots__ = ["aaa", "bbb"]
...
>>> a.aaa = 10
>>> a.bbb = 20
>>>
 

こんな感じ。
このとき、__slots__に指定されていない変数名を指定すると・・・


>>> a.X = [1,2,3,4]
Traceback (most recent call last):
File "", line 1, in ?
AttributeError: 'C1' object has no attribute 'X'
>>>
 

怒られる。

制約もつく。インスタンスに__dict__属性を持てなくなったりする。
もちろん__slots__に指定すればよいらしい。



プロパティ
プロパティを使用すると、インスタンス属性へのアクセスには、自動で対応するメソッドをコール
させることができるようになる。
__getattr__や__setattr__と違うのは、コールされるメソッド、対応するメソッドを指定しなければ
ならないこと。(指定できること)


で、その例。

>>> class C1(object):
... def getabc(self):
... return self._abc
... def setabc(self, x):
... self._abc = x
... abc = property(getabc,setabc,None,None)
...
>>> a = C1()
>>> a.setabc(10)
>>> a.getabc()
10
>>>
 

propertyのパラメータはそれぞれ、

getter、setter、del、docs
 

だそうです。



__getattribute__
存在しない属性へのアクセス時の__getattr__とは違って、全ての属性へのアクセスに対応する。
かなり扱いづらいらしい。無限ループに簡単に陥るかららしい。

詳細の記述はなし。



おしまい
.

0 コメント: