56

オブジェクト指向プログラミングの Python クラスを教えていて、クラスの説明方法をブラッシュアップしていると、空のクラス定義が表示されました。

class Employee:
    pass

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

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

面白い!

このようなクラスのインスタンスに対して関数を動的に定義する方法があるかどうか疑問に思っていますか? 何かのようなもの:

john.greet() = print 'Hello, World!'

これは私の Python インタープリターでは機能しませんが、別の方法はありますか?

4

4 に答える 4

46

クラスは多かれ少なかれ、dictオブジェクトへの属性の派手なラッパーです。クラスをインスタンス化すると、その属性に割り当てることができ、それらは に格納されfoo.__dict__ます。同様に、foo.__dict__既に記述した属性を調べることができます。

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

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

特定のインスタンスへの割り当てと同様に。self(編集:パラメータを追加)

于 2011-06-01T15:57:29.943 に答える
18

で試してくださいlambda

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

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

john.greet()

EDIT : Thomas Kさんのメモに感謝します。これは Python2 では機能しませPython 3.2ん。しかし、これはステートメントなしで s に対して機能します (そうですか? 申し訳ありませんが、私は(: ) しか知りません)printstatementlambdapython3.2

于 2011-06-01T15:52:15.190 に答える
1

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)
于 2016-09-08T12:20:53.070 に答える