web-dev-qa-db-ja.com

python空のクラスオブジェクト

私はオブジェクト指向プログラミングでpythonクラスを教えています。クラスを説明する方法をブラッシュアップしているときに、空のクラス定義を見ました:

class Employee:
    pass

次に、このクラスのオブジェクトの名前とその他の属性を定義する例が続きます。

john = Employee()
john.full_name = "john doe"

面白い!

このようなクラスのインスタンスの関数を動的に定義する方法があるのだろうか?何かのようなもの:

john.greet() = print 'hello world!'

これは私のpythonインタープリターでは動作しませんが、それを行う別の方法がありますか?

47
Ramy

クラスは、多かれ少なかれ、オブジェクトの属性のdictの派手なラッパーです。クラスをインスタンス化すると、その属性に割り当てることができ、それらはfoo.__dict__に保存されます。同様に、foo.__dict__で、すでに作成した属性を確認できます。

これは、次のようなきちんとした動的なことができることを意味します。

class Employee: pass
def foo(self): pass
Employee.foo = foo

特定のインスタンスに割り当てることもできます。 (編集:selfパラメーターを追加)

35
Katriel

lambdaで試してください:

john.greet = lambda : print( 'hello world!' )

あなたができるようになります:

john.greet()

[〜#〜] edit [〜#〜]:ありがとうThomas K注-これはPython 3.2ではなく、 Python2の場合、printstatementのように見えました。しかし、これはlambdasで機能し、なし(右?ごめん、私はpython3.2(:)しか知らない

16
Kiril Kirov

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)
0
Laryx Decidua

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キーへの属性アクセスが必要な場合など、他の状況でも役立ちます。

0
Sudheer