1

(Python 3.2に関して)

私は次の行に沿って声明を出そうとしています:

Pythonでは、オブジェクトは...

ドキュメント(http://docs.python.org/py3k/reference/datamodel.html#objects-values-and-types)によると:

すべてのオブジェクトには、ID、タイプ、および値があります

しかし、属性はどこに分類されますか?a = 3; print(a.__class__)私が得るようなことをするなら<class 'int'> 、それはオブジェクトa参照のタイプであると思います。つまり、「タイプ」はオブジェクトの「属性」です。したがって、その意味で、オブジェクトが持つ十分な「もの」のセットは、そのアイデンティティ、値、および属性であると言えます。ただし、usingの属性を調べると、dir(a)IDに似たものは何も見つかりません(id()関数がその情報を教えてくれることはわかっていますが)。

だから私の質問は、Pythonオブジェクトの概念を十分に説明するための次の最小限のステートメントのいずれかですか?

  1. Pythonでは、オブジェクトには属性があり、その属性には常にID、タイプ、および値が含まれます。

  2. Pythonでは、オブジェクトにはIDと属性があり、そのタイプと値は常に含まれています。

  3. Pythonでは、オブジェクトにはID、値、属性があり、その中には常にその型が含まれています。

そうでない場合、誰かが私にオブジェクトの関係属性、アイデンティティ、タイプ、および値を伝える定義を与えることができますか?

(私は1番が真であることを望みます。:P)

4

3 に答える 3

2

属性を介してオブジェクトのタイプにアクセスできますが、そのタイプは単なる属性ではありません。タイプは、オブジェクトが属性を持つ前にオブジェクトがどのように作成されたかを定義します。その事実だけでは、Pythonオブジェクトを説明するのにこれらのステートメントはどれも十分ではありません。

私はそれをこのように言うでしょう:

Pythonでは、すべてがオブジェクトです。

オブジェクトは情報のブロックであり、その作成と他のオブジェクトとの相互作用を定義するタイプ、他のすべてのオブジェクトと区別するためのID、およびブロック内の情報である値を持ちます。属性は、そのタイプであるオブジェクトを含む、特定のオブジェクトに関連付けられた他のオブジェクトです。

次に、関数のように、人々がオブジェクトであるとは思わないかもしれないものの例をいくつか挙げる必要があります。

「オブジェクトとは」に関する段落は、DiveIntoPythonにあります。

Pythonのすべてがオブジェクトであり、ほとんどすべてに属性とメソッドがあります。すべての関数には__doc__、関数のソースコードで定義されたドキュメント文字列を返す組み込み属性があります。モジュールは、 (sysとりわけ)と呼ばれる属性を持つオブジェクトですpath。などなど。

それでも、これは論点先取です。オブジェクトとは何ですか?プログラミング言語が異なれば、「オブジェクト」はさまざまな方法で定義されます。場合によっては、すべてのオブジェクトに属性とメソッドが必要であることを意味します。その他の場合は、すべてのオブジェクトがサブクラス化可能であることを意味します。Pythonでは、定義は緩いです。一部のオブジェクトには属性もメソッドもありません(これについては第3章で詳しく説明します)。また、すべてのオブジェクトがサブクラス化できるわけではありません(これについては第5章で詳しく説明します)。ただし、変数に割り当てたり、関数の引数として渡すことができるという意味では、すべてがオブジェクトです(これについては第4章で詳しく説明します)。

于 2012-04-05T01:34:41.400 に答える
1

用語が混同されていると思います。

身元

オブジェクトのIDは、そのオブジェクトの存続期間中にそのオブジェクトを一意に識別する値にすぎません。したがって、id(1)とは異なることが保証されていますid(2)

タイプ

オブジェクトのタイプは、さらに何かを教えてくれます。そのオブジェクトで使用できる操作と、そのオブジェクトに格納できる可能な値を示します。タイプには、組み込みとユーザー定義の2種類があります。組み込み型はintstringなどです。ユーザー定義は、自分で定義するクラスです。

価値

これは、タイプ内に格納されているものです。

属性

これらは、既存のオブジェクトから取得できる追加の変数です。

例:

>>> s = "foo" # s is a new variable
>>> id(s) # it has a unique identifier
4299579536
>>> type(s) # it has a type ("str")
<type 'str'>
>>> s # it has a value ("foo")
'foo'
>>> s.__class__ # it has an attribute called __class__ that has the following value:
<type 'str'>

したがって、3つのステートメントはすべて正しい可能性がありますが、#3は私には「最も正しい」ように聞こえます。私も聞いたことがあります

In Python, an object is a dict.

これは私には理にかなっていますが、すべての人には理にかなっていないかもしれません。

于 2012-04-04T23:35:56.970 に答える
1

しかし、属性はどこに分類されますか?

(いくつかの組み合わせ)特定のオブジェクトの属性は、その値を記録して決定します。

値、タイプ、アイデンティティの3つはすべて、例によってのみ実際に理解できる抽象的な概念です。検討:

>>> a = (1, 2)
>>> b = (1, 2)
>>> c = a
>>> d = (3, 4)
>>> e = 2

、、、およびはすべて等しいことは間違いありませんがa、 aとcだけが同じオブジェクトです。つまり、3つすべてが同じ値を持ち、aとcは同じアイデンティティを持ちます。(タプル)と同じタイプのオブジェクトですが、値が異なります。eは完全に異なる型(int)です。の値は人間にとって理解するのは簡単ですが(intリテラルはよく知られた記号で綴られているため)、Pythonはそのいくつかの属性を追跡します。bcdae

>>> e.numerator
2
>>> e.denominator
1
>>> e.real
2
>>> e.imag
0

これらは一緒に値を決定します-であるにもかかわらずint、分母が1であり、虚数部が0であることが保証されます(実際、Rationalに組み込まれているすべての虚数部はゼロです)。したがって、anの値intはその分子です。

しかし、「価値」は抽象的なものです。人間にとっては理にかなっているので、コンピューターはそれをもう少し理解する必要があります。同様にタイプ-「これはどのタイプのものですか?」人間が直接理解するものです。コンピューターはそうではありませんが、Pythonはそれを実装するためにクラスを使用します-したがって、

>>> type('')
<class 'str'>
>>> type(2)
<class 'int'>

「これはどんなタイプなの?」と聞くと、クラスが返ってきます。型は属性として保存されますが、これはPythonがオブジェクトの型をその値の(潜在的な)一部と見なすためです。Identityは値の一部ではないため(場合によっては同等である可能性があります)、属性には記録されません。これは、Pythonが言うときに必要なオブジェクトを見つけることができる内部機構に格納されますa

于 2012-04-05T02:14:21.293 に答える