私はオブジェクト指向プログラミングでpythonクラスを教えています。クラスを説明する方法をブラッシュアップしているときに、空のクラス定義を見ました:
class Employee:
pass
次に、このクラスのオブジェクトの名前とその他の属性を定義する例が続きます。
john = Employee()
john.full_name = "john doe"
面白い!
このようなクラスのインスタンスの関数を動的に定義する方法があるのだろうか?何かのようなもの:
john.greet() = print 'hello world!'
これは私のpythonインタープリターでは動作しませんが、それを行う別の方法がありますか?
クラスは、多かれ少なかれ、オブジェクトの属性のdict
の派手なラッパーです。クラスをインスタンス化すると、その属性に割り当てることができ、それらはfoo.__dict__
に保存されます。同様に、foo.__dict__
で、すでに作成した属性を確認できます。
これは、次のようなきちんとした動的なことができることを意味します。
class Employee: pass
def foo(self): pass
Employee.foo = foo
特定のインスタンスに割り当てることもできます。 (編集:self
パラメーターを追加)
lambda
で試してください:
john.greet = lambda : print( 'hello world!' )
あなたができるようになります:
john.greet()
[〜#〜] edit [〜#〜]:ありがとうThomas K注-これはPython 3.2
ではなく、 Python2の場合、print
はstatement
のように見えました。しかし、これはlambda
sで機能し、文なし(右?ごめん、私はpython3.2
(:)しか知らない
collection
標準モジュールの「名前付きタプル」を使用することもできます。名前付きタプルは「通常の」タプルのように機能しますが、要素には名前があり、「ドット構文」を使用して要素にアクセスできます。 コレクションドキュメント から:
>>> # Basic example
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22) # instantiate with positional or keyword arguments
>>> p[0] + p[1] # indexable like the plain Tuple (11, 22)
33
>>> x, y = p # unpack like a regular Tuple
>>> x, y
(11, 22)
>>> p.x + p.y # fields also accessible by name
33
>>> p # readable __repr__ with a name=value style
Point(x=11, y=22)
AttrDictを使用できます
>>> from attrdict import AttrDict
>>> my_object = AttrDict()
>>> my_object.my_attribute = 'blah'
>>> print my_object.my_attribute
blah
>>>
PyPIからattrdictをインストールします。
pip install attrdict
Dictキーへの属性アクセスが必要な場合など、他の状況でも役立ちます。