14

Python では、そのクラス インスタンスを介してクラス変数にアクセスできます。

>>> class A(object):
...     x = 4
...
>>> a = A()
>>> a.x
4

a.xが実際に に解決されA.x、構築中にインスタンスにコピーされないことを示すのは簡単です。

>>> A.x = 5
>>> a.x
5

この動作はよく知られており、広く使用されているという事実にもかかわらず、これをカバーする決定的なドキュメントは見つかりませんでした。Python ドキュメントで見つけた最も近いものは、クラスのセクションでした:

class MyClass:
    """A simple example class"""
    i = 12345
    def f(self):
        return 'hello world'

[をちょきちょきと切る]

... 定義により、関数オブジェクトであるクラスのすべての属性は、そのインスタンスの対応するメソッドを定義します。したがって、この例では、は関数であるx.fため、有効なメソッド参照ですが、そうではないため、そうではありません。...MyClass.fx.iMyClass.i

ただし、この部分ではメソッドについて具体的に説明しているため、一般的なケースにはおそらく関係ありません。

私の質問は、これは文書化されていますか? この動作に頼ることができますか?

4

2 に答える 2

13

http://docs.python.org/reference/datamodel.htmlClassesClass instancesの部分を参照

クラスには、ディクショナリ オブジェクトによって実装される名前空間があります。クラス属性参照は、このディクショナリ内のルックアップに変換されます。たとえば、Cx は C.__dict__["x"] に変換されます (ただし、特に新しいスタイルのクラスの場合、属性を見つける他の手段を可能にするフックがいくつかあります)。

クラス インスタンスは、クラス オブジェクトを呼び出すことによって作成されます (上記を参照)。クラス インスタンスには、属性参照が検索される最初の場所であるディクショナリとして実装された名前空間があります。そこに属性が見つからず、インスタンスのクラスにその名前の属性がある場合、検索はクラス属性で続行されます。

一般に、この使用法は問題ありませんが、「特に新しいスタイルのクラスには、属性を見つける他の手段を可能にする多くのフックがあります」として言及されている特別な場合を除きます。

于 2012-04-25T10:11:59.517 に答える
8

この行動に頼るだけでなく、常にそうしています。

方法を考えてください。メソッドは、クラス属性にされた単なる関数です。次に、インスタンスで検索します。

>>> def foo(self, x):
...     print "foo:", self, x
... 
>>> class C(object):
...     method = foo # What a weird way to write this! But perhaps illustrative?
... 
>>> C().method("hello")
foo: <__main__.C object at 0xadad50> hello

関数のようなオブジェクトの場合、これは単純なルックアップではありませんが、いくつかの魔法が発生して自動的に渡さselfれます。クラス属性として格納され、インスタンスで検索されることを意図した他のオブジェクトを使用した可能性があります。プロパティは一例です (propertyよく知らない場合は、ビルトインを調べてください)。

okm が指摘しているように、これがどのように機能するかは、データ モデル リファレンスに記載されています(メソッドとプロパティを機能させる魔法に関する情報と詳細情報へのリンクを含む)。Data Model ページは、Language Reference の中で群を抜いて最も役立つ部分です。また、ほとんどすべての__foo__メソッドと名前に関するドキュメントも含まれています。

于 2012-04-25T12:25:31.847 に答える