3

私はPythonクラスを持っています

class pytest:
    i = 34
    def func(self):
        return "hello world"

にアクセスするpytest.iと、34 が返されます。これを別の方法で行うこともできます。

a = pytest()
a.i

これも34になります。

(存在しない) にアクセスしようとするとpytest.j

Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
pytest.j
AttributeError: class pytest has no attribute 'j'

試してみるa.jと、エラーは

Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
a.j
AttributeError: pytest instance has no attribute 'j'

だから私の質問は次のとおりです。2つのケースで正確に何が起こり、違いは何ですか?

4

2 に答える 2

7

いいえ、これらは2つの異なるものです。

Pythonでは、すべてがオブジェクトです。クラスはオブジェクトであり、関数はオブジェクトであり、インスタンスはオブジェクトです。すべてがオブジェクトであるため、すべてが同じように動作します。あなたの場合、「pytest」という名前のクラスインスタンス(==「Class」タイプのオブジェクト)を作成します。そのオブジェクトには、との2つの属性がiありfucます。iは「整数」または「数値」fucのインスタンスであり、「関数」のインスタンスです。

「pytest.j」を使用する場合は、Pythonに「オブジェクトpytestを検索し、オブジェクトがある場合は検索するi」と指示します。「pytest」はクラスインスタンスですが、それは問題ではありません。

「pytest」のインスタンス(==「pytest」タイプのオブジェクト)を作成すると、「defaults」を持つオブジェクトが作成されます。あなたの場合、は、で見つからないものはすべて、次で検索されることを意味aするインスタンスです。pytestapytest

つまり、「調べてください。そこにない場合は、調べてa.jください」という意味です。しかし、存在せず、Pythonは意味のあるエラーメッセージを表示する必要があります。「クラスpytestには属性'j'がありません」と言うことができます。これは正しいですが、意味がありません。を介してアクセスしようとしたことを自分で理解する必要があります。紛らわしいでしょう。Guidoにはありません。apytestjja

したがって、Pythonは別のエラーメッセージを使用します。インスタンスの名前()が常にあるとは限らないためa、設計者は代わりに型を使用することにしました。これにより、「pytestinstance...」が得られます。

于 2009-08-20T09:01:01.120 に答える