21

This happens in python2.7

I am working on the idea of meta class in python, almost all the tutorial refer object as instance of a class, in python. However, when playing with the class A(): form of defining a class, I saw this:

class ClsDef1():
    pass
C1 = ClsDef1()
print C1
<__main__.ClsDef1 instance at 0x2aea518>

class ClsDef2(object):
    pass
C2 = ClsDef2()
print C2
<__main__.ClsDef2 object at 0x2ae68d0>

This means when create a instance from a class that is not inherent from object, the instance is an instance, but when a class is inherent from object, the instance of the class is an object?

Could anyone explain the difference? In real life which one should I use?

Thanks!

4

3 に答える 3

13

これは、新しいスタイルのクラスと古いスタイルのクラスの違いであり、ドキュメントで詳細に説明されています。基本的に、Python 2.xでは、新しいスタイルのクラスを取得できるように、常にオブジェクトから継承するようにする必要があります。Python 3では、古いスタイルのクラスは完全になくなりました。

于 2012-05-25T17:59:42.010 に答える
4

簡単な答え:Pythonでは、すべてのオブジェクトにタイプ(type(x)によって返される)があり、これもオブジェクトです。
't'がタイプオブジェクトの場合、そのタイプは特殊タイプ'タイプ'です。したがって、(type(type(x))is type)は常にTrueです。古いクラスでは、ユーザー定義の「class」は「classobj」タイプのオブジェクトであり、任意のクラスの各インスタンスは「instance」タイプのオブジェクトです。つまり、クラスを実装する2つの組み込みタイプ「classobj」と「instance」があります。インスタンスからそのクラスへのリンクは、その__class__メンバーを介して行われます。

新しいクラスの場合:ユーザー定義クラスは実際には新しいタイプのオブジェクトであり(タイプは「classobj」ではなく「type」です)、それらのインスタンスを作成すると、各インスタンスのtype()がクラスオブジェクトになります。そのため、異なるユーザー定義クラスのオブジェクトは、異なるタイプを持つようになりました。そして、クラスは基本的にすべての組み込みタイプと同じ基盤にあります。古いクラスでは、instance->classとobject->typeの別々の構造があり、新しいクラスは両方にobject->typeを使用します。

ドキュメントにはもっとたくさんありますが、それがその核心です。

于 2012-05-25T18:23:33.140 に答える
2

「クラス」と「タイプ」のあいまいさとは異なり、「インスタンス」は「オブジェクト」と同義です。このように考えてください。オブジェクトは型のインスタンスです。したがって、「42はint型のインスタンスです」は、「42はintオブジェクトです」と同じです。私は通常、「インスタンス」と「オブジェクト」を同じ意味で使用します。引用元:https ://eli.thegreenplace.net/2012/03/30/python-objects-types-classes-and-instances-a-glossary

于 2017-07-15T05:44:26.040 に答える