2014/11/13

【Python】 Class(2) 属性をあとから足したりする

PythonのClass 二回目。
(一回目はこちら)

Classのなかに入れる変数や関数を、ひっくるめて「属性(attribute)」というそうです。
Classを用意する際以外でも、あとから追加できます。
(※後から追加できるのねっていうのを最近知ったので、そのメモも兼ねつつ…w)





class testCls :
    pass

test = testCls()
dir(test)
['__doc__', '__module__']

空のクラスを作って、dir() でなかみをみてたところ。
標準でできちゃう二つのインスタンス変数を除けば、空です。

それでは、属性を追加してみます。

test.x = 1
test.name = 'john'
test.ls = ['a','b','c']

dir(test)
['__doc__', '__module__', 'ls', 'name', 'x']

このように、ドットに続けてなにか足したい属性名を書いて、
普通に代入してあげればOK

test.x = 456
test.x = 'abc'

重ねて代入すると、上書きされます。

関数も入ります。

def testFunc():
    print 'yoroshiku'

test.printYoro = testFunc

test.printYoro()
yoroshiku

これらは、setattr() 関数を使ってもできます。
> http://docs.python.jp/2/library/functions.html#setattr

削除はこんな感じ。

del test.x

print test.x
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: testCls instance has no attribute 'x'

del を使います。
一度 del したら、そのあと呼び出そうとしても「AttributeError」が返って来ます。

と、このように、属性をカンタンに足したり抜いたりできるのですが、
これだとアクセス容易過ぎて、せっかく設計したクラスをめちゃくちゃにすることも簡単だということになります。
そこで、属性にアクセスする際の振る舞いをカスタマイズする仕組み
というのも用意されています。

属性値アクセスをカスタマイズする @ データモデル — Python 2.7ja1 documentation
http://docs.python.jp/2/reference/datamodel.html#attribute-access

これらを活用するには、「新しい形式のクラス(新スタイルクラス) 」でクラスを用意する必要があります。なんじゃそりゃつづく。



■ 参考

「ところで、 属性 という言葉は、ドットに続く名前すべてに対して使っています」
9.2. Python のスコープと名前空間 @ 9. クラス — Python 2.7ja1 documentation
http://docs.python.jp/2/tutorial/classes.html#python

9.7. 残りのはしばし @ 9. クラス — Python 2.7ja1 documentation
http://docs.python.jp/2/tutorial/classes.html#tut-odds

setattr(object, name, value) @ 2. 組み込み関数 — Python 2.7ja1 documentation
http://docs.python.jp/2/library/functions.html#setattr

cf. mayaモジュールの setAttr() とは違いますw
http://download.autodesk.com/global/docs/maya2014/ja_jp/CommandsPython/setAttr.html



0 件のコメント:

コメントを投稿