ホームページ >バックエンド開発 >Python チュートリアル >Python でクラスにプロパティを動的に追加するにはどうすればよいですか?

Python でクラスにプロパティを動的に追加するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-09 22:40:02641ブラウズ

How do you add properties to a class dynamically in Python?

クラスにプロパティを動的に追加する方法

問題

データベースの結果セットを模倣するモック クラスを作成することを目的としています。たとえば、データベース クエリが {'ab':100, 'cd':200} を返すと、次のことが期待されます。

>>> dummy.ab
100

Solution

プロパティをプロパティに追加しているにもかかわらず、クラスを動的に処理することは可能ですが、クラス自体に追加する必要があります。

>>> class Foo(object):
...     pass
...
>>> foo = Foo()
>>> foo.a = 3
>>> Foo.b = property(lambda self: self.a + 1)
>>> foo.b
4

プロパティは記述子の単純な実装であり、特定のクラスでカスタム属性処理を提供するオブジェクトです。これは、__getattribute__ 内の広範な if ツリーの代わりとして機能します。

foo.b をリクエストすると、Python は、クラスで定義された b が記述子プロトコルに従っていることを認識します。記述子プロトコルは、単純に を持つオブジェクトを示します。 get__、__set__、または __delete メソッド。記述子はその属性を処理する責任を負い、Python に Foo.b.__get__(foo, Foo) を呼び出すよう促し、戻り値が属性の値として返されます。プロパティの場合、これらの各メソッドは、プロパティ コンストラクターに指定した fget、fset、または fdel を呼び出すだけです。

記述子は、OO 実装全体の複雑さを公開する Python のメカニズムです。ちなみに、プロパティよりもさらに普及している、別の種類の記述子があります。

>>> class Foo(object):
...     def bar(self):
...         pass
...
>>> Foo().bar
<bound method Foo.bar of <__main__.Foo object at 0x7f2a439d5dd0>>
>>> Foo().bar.__get__
<method-wrapper '__get__' of instancemethod object at 0x7f2a43a8a5a0>

humble メソッドも、さらに別の種類の記述子です。その get は、最初の引数として呼び出し元のインスタンスにプレフィックスを付けます。本質的には、これは次のことを行います:

def __get__(self, instance, owner):
    return functools.partial(self.function, instance)

おそらくこれが、記述子がクラスにのみ適用される理由です。記述子は、そもそもクラスを支えるメカニズムを形式化します。これらはルールの例外です。クラス自体が型インスタンスであるにもかかわらず、間違いなく記述子をクラスに割り当てることができます。実際、Foo.bar を取得しようとすると、依然として property.__get__ が呼び出されます。ただし、クラス属性としてアクセスされたときに記述子が自身を返すのは慣用的です。

記述子を使用すると、Python の OO システムの大部分を Python 自体で記述することができます。

以上がPython でクラスにプロパティを動的に追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。