検索
ホームページバックエンド開発Python チュートリアルpython的type和object之间是怎么一种关系?

是初学者请勿喷啊
两个是互为实例的关系,但不是互为子类的关系,只有type是object的子类,反之则不成立。大牛说两者是蛋生鸡鸡生蛋的关系,但我还是不明白,有懂的麻烦解释一下,希望不要给出外文的链接。python为什么设计出两个,去掉 一个行不行?

回复内容:

给别人讲解过很多次,但写成文字是第一次。试一试吧,自己主要也是看了这篇文章(Python Types and Objects)才懂的。

object 和 type的关系很像鸡和蛋的关系,先有object还是先有type没法说,obejct和type是共生的关系,必须同时出现的。

在看下去之前,也要请先明白,在Python里面,所有的东西都是对象的概念。

在面向对象体系里面,存在两种关系:
- 父子关系,即继承关系,表现为子类继承于父类,如『蛇』类继承自『爬行动物』类,我们说『蛇是一种爬行动物』,英文说『snake is a kind of reptile』。在python里要查看一个类型的父类,使用它的__bases__属性可以查看。
- 类型实例关系,表现为某个类型的实例化,例如『萌萌是一条蛇』,英文说『萌萌 is an instance of snake』。在python里要查看一个实例的类型,使用它的__class__属性可以查看,或者使用type()函数查看。

这两种关系使用下面这张图简单示意,继承关系使用实线从子到父连接,类型实例关系使用虚线从实例到类型连接:
python的type和object之间是怎么一种关系?

我们将使用一块白板来描述一下Python里面对象的关系,白板划分成三列:
python的type和object之间是怎么一种关系?
先来看看type和object:
>>> object

>>> type

它们都是type的一个实例,表示它们都是类型对象。

在Python的世界中,object是父子关系的顶端,所有的数据类型的父类都是它;type是类型实例关系的顶端,所有对象都是它的实例的。它们两个的关系可以这样描述:
- object是一个type,object is and instance of type。即Object是type的一个实例。

>>> object.__class__

>>> object.__bases__ # object 无父类,因为它是链条顶端。
()
- type是一种object, type is kind of object。即Type是object的子类。

>>> type.__bases__
(,)
>>> type.__class__ # type的类型是自己


此时,白板上对象的关系如下图:
python的type和object之间是怎么一种关系?

我们再引入list, dict, tuple 这些内置数据类型来看看:
>>> list.__bases__
(,)
>>> list.__class__

>>> dict.__bases__
(,)
>>> dict.__class__

>>> tuple.__class__

>>> tuple.__bases__
(,)
它们的父类都是object,类型都是type。

再实例化一个list看看:
>>> mylist = [1,2,3]
>>> mylist.__class__

>>> mylist.__bases__
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'list' object has no attribute '__bases__'
实例化的list的类型是, 而没有了父类。

把它们加到白板上去:
python的type和object之间是怎么一种关系?白板上的虚线表示源是目标的实例,实线表示源是目标的子类。即,左边的是右边的类型,而上面的是下面的父亲。
虚线是跨列产生关系,而实线只能在一列内产生关系。除了type和object两者外。

当我们自己去定个一个类及实例化它的时候,和上面的对象们又是什么关系呢?试一下:

>>> class C(object):
... pass
...
>>> C.__class__

>>> C.__bases__
(,)

实例化
>>> c = C()
>>> c.__class__

>>> c.__bases__
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'C' object has no attribute '__bases__'
这个实例化的C类对象也是没有父类的属性的。
再更新一下白板:
python的type和object之间是怎么一种关系?白板上的第一列,目前只有type,我们先把这列的东西叫Type。
白板上的第二列,它们既是第三列的类型,又是第一列的实例,我们把这列的对象叫TypeObject。
白板上的第三列,它们是第二列类型的实例,而没有父类(__bases__)的,我们把它们叫Instance。

你以为事情就这样完了?不。。看见type孤零零在第一列其实不是那么舒服。。我们给它整几个玩伴看看。但要怎么整呢?要属于第一列的,必须是type的子类,那么我们只需要继承type来定义类就可以了:
>>> class M(type):
... pass
...
>>> M.__class__

>>> M.__bases__
(,)
>>>
嗯嗯,M类的类型和父类都是type。这个时候,我们可以把它归到第一列去。那么,要怎么样实例化M类型呢?实例化后它应该出现在那个列?嗯嗯,好吧,刚才你一不小心创建了一个元类,MetaClass!即类的类。如果你要实例化一个元类,那还是得定义一个类:
>>> class TM(object):
... __metaclass__ = M # 这样来指定元类。
...
...
>>> TM.__class__
# 这个类不再是type类型,而是M类型的。
>>> TM.__bases__
(,)

好了,现在TM这个类就是出现在第二列的。

再总结一下:
第一列,元类列,type是所有元类的父亲。我们可以通过继承type来创建元类。
第二列,TypeObject列,也称类列,object是所有类的父亲,大部份我们直接使用的数据类型都存在这个列的。
第三列,实例列,实例是对象关系链的末端,不能再被子类化和实例化。

到现在为止,Python类型的秘密已经说穿了,不一小心连元类也暴露了。哎。慢慢消化吧,信息量很大。

如果转述版看不懂,那么去啃一啃原文的吧:(Python Types and Objects)

=============更新=============
更新更新。。回答一下题主在问题后面说的为什么要有两个,而不是一个。
如果type和object只保留一个,那么一定是object。只有object 时,第一列将不复存在,只剩下二三列,第二列表示类型,第三列表示实例,这个和大部分静态语言的类型架构类似,如java 。
这样的架构将让python 失去一种很重要的动态特性--动态创建类型。本来,类(第二列的同学)在Python里面是一个对象(typeobject),对象是可以在运行时动态修改的,所以我们能在你定义一个类之后去修改他的行为或属性!拿掉第一列后,第二列变成了纯类型,写成怎样的,运行时行为就怎样。在这一点上,并不比静态语言有优势。
所以,以上! 那我就来补充个跟实现思路相关的传送门吧:先有Class还是先有Object? - RednaxelaFX 的回答
python的type和object之间是怎么一种关系?
图对不对先不管。我们先来看看 type 和 object 分别是什么。

type 实际上是:
#define PyVarObject_HEAD_INIT(type, size)       \
    1, type, size,

PyTypeObject PyType_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "type",                                     /* tp_name */
    sizeof(PyHeapTypeObject),                   /* tp_basicsize */
    sizeof(PyMemberDef),                        /* tp_itemsize */
    0,                                          /* tp_base */
    ...
}
谢邀,object是type(object的类型是type),type也是object(type继承自object)
<span class="o">>>></span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">object</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span>
<span class="bp">True</span>
<span class="o">>>></span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">type</span><span class="p">,</span> <span class="nb">object</span><span class="p">)</span>
<span class="bp">True</span>
这部分我当初是读MSDN里关于C Sharp的Object 和 type 的关系读懂的……你如果手边有Jeffery的《CLR via C#》 可以读一下。专门为了这个问题去买一本可能有点奢侈,不过如果你是 .net 程序员,我推荐你收一本。

简单的说,很多运行时体系(不一定是针对某种语言)都提供在运行时获取类型信息的功能,那么获取出来的是什么东西呢?获取出来的是一个描述类型信息的对象。那么所有描述类型信息的对象,都是“类型”这个类型的实例。这个type类型不是类型本身,而是用于描述类型的对象实例,类型本身是一种抽象的信息,type类的实例对象是它具体的信息载体。既然type类型也是一种类型,那么它是公共根类型object的一个派生,也就是合情合理的设计了。

反过来,object 类型并不依赖 type 类型,最多它的一些反射/自省逻辑需要调用type。 object是一种类型,type是描述类型的类型。
  1. 所有对象都一定是某一个类的实例
  2. 在python中类也是对象,所有类都是type元类的实例
  3. type元类也是对象,它是它自己的实例,它的父类是object
  4. object是类,它是type的实例,object没有父类

我想这大概是是为了完成完全的面向对象,既然万物都是对象,那最源头的对象又是谁的实例?type和object很好地解决了这个问题:抓着自己的鞋带把自己提起来(bootstrap)。

python新手,说错请指正。 Python中一切皆对象,凡事对象都有类型。
从cpython/object.h at 2.7 · python/cpython · GitHub
<span class="cm">/* PyObject_HEAD defines the initial segment of every PyObject. */</span>
<span class="cp">#define PyObject_HEAD                   \</span>
<span class="cp">    _PyObject_HEAD_EXTRA                \</span>
<span class="cp">    Py_ssize_t ob_refcnt;               \</span>
<span class="cp">    struct _typeobject *ob_type;</span>
既不是互为实例:
>>> object.__class__

>>> type.__class__

也不是互为子类:
>>> object.__bases__
()
>>> type.__bases__
(,)

type和object都是type的实例,而type是object的子类。

__class__是这两个关系中更基本的一个。所有Python对象都有对应的class对象,而对一个Python的几乎所有操作,即使是访问对象属性o.a这么基本的,都是转交给其class对象执行。唯二的例外,是__class__和id,这两个操作的语义无法被class对象改变。在这方面,Python的可定制程度比绝大部分OOPL要高。

type是所有class对象的class,也称为metaclass。它决定了你直接操作class对象(而不是通过其实例)时的行为。例如:
class C(object):
    a = 1
    def f(self):
        pass
c = C()
c.f() # 行为由C决定
C.a # 行为由type决定
之前读过一篇讨论这个问题文章,链接已经丢了。。。建议题主读一读《Ruby元编程》,这本书对类和对象有较清晰和深入的讨论,要求不高,Ruby和Python的对象模型非常相似,不懂Ruby也能读懂。

要搞懂这个问题,首先要先把类、类型、对象这些概念全部舍掉,重构世界观。

首先,python里面一切皆是对象,包括type、object、所有class,全部都是对象,

那对象之间靠什么联系在一起呢?没错,靠的就是关系:
Python的世界里,对象之间一共有两种关系:

1、继承关系:
比如有class A和class B(A),再强调一下,A和B都是对象,
则对象B继承了对象A,或者说A是B的超类,
继承关系可以通过__base__属性得知,
<span class="o">>>></span> <span class="n">B</span><span class="o">.</span><span class="n">__base__</span>
<span class="o"><</span><span class="k">class</span> <span class="err">'</span><span class="nc">A</span><span class="s">'></span>
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Pythonの学習:2時間の毎日の研究で十分ですか?Pythonの学習:2時間の毎日の研究で十分ですか?Apr 18, 2025 am 12:22 AM

Pythonを1日2時間学ぶだけで十分ですか?それはあなたの目標と学習方法に依存します。 1)明確な学習計画を策定し、2)適切な学習リソースと方法を選択します。3)実践的な実践とレビューとレビューと統合を練習および統合し、統合すると、この期間中にPythonの基本的な知識と高度な機能を徐々に習得できます。

Web開発用のPython:主要なアプリケーションWeb開発用のPython:主要なアプリケーションApr 18, 2025 am 12:20 AM

Web開発におけるPythonの主要なアプリケーションには、DjangoおよびFlaskフレームワークの使用、API開発、データ分析と視覚化、機械学習とAI、およびパフォーマンスの最適化が含まれます。 1。DjangoandFlask Framework:Djangoは、複雑な用途の迅速な発展に適しており、Flaskは小規模または高度にカスタマイズされたプロジェクトに適しています。 2。API開発:フラスコまたはdjangorestFrameworkを使用して、Restfulapiを構築します。 3。データ分析と視覚化:Pythonを使用してデータを処理し、Webインターフェイスを介して表示します。 4。機械学習とAI:Pythonは、インテリジェントWebアプリケーションを構築するために使用されます。 5。パフォーマンスの最適化:非同期プログラミング、キャッシュ、コードを通じて最適化

Python vs. C:パフォーマンスと効率の探索Python vs. C:パフォーマンスと効率の探索Apr 18, 2025 am 12:20 AM

Pythonは開発効率でCよりも優れていますが、Cは実行パフォーマンスが高くなっています。 1。Pythonの簡潔な構文とリッチライブラリは、開発効率を向上させます。 2.Cのコンピレーションタイプの特性とハードウェア制御により、実行パフォーマンスが向上します。選択を行うときは、プロジェクトのニーズに基づいて開発速度と実行効率を比較検討する必要があります。

Python in Action:実世界の例Python in Action:実世界の例Apr 18, 2025 am 12:18 AM

Pythonの実際のアプリケーションには、データ分析、Web開発、人工知能、自動化が含まれます。 1)データ分析では、PythonはPandasとMatplotlibを使用してデータを処理および視覚化します。 2)Web開発では、DjangoおよびFlask FrameworksがWebアプリケーションの作成を簡素化します。 3)人工知能の分野では、TensorflowとPytorchがモデルの構築と訓練に使用されます。 4)自動化に関しては、ファイルのコピーなどのタスクにPythonスクリプトを使用できます。

Pythonの主な用途:包括的な概要Pythonの主な用途:包括的な概要Apr 18, 2025 am 12:18 AM

Pythonは、データサイエンス、Web開発、自動化スクリプトフィールドで広く使用されています。 1)データサイエンスでは、PythonはNumpyやPandasなどのライブラリを介してデータ処理と分析を簡素化します。 2)Web開発では、DjangoおよびFlask Frameworksにより、開発者はアプリケーションを迅速に構築できます。 3)自動化されたスクリプトでは、Pythonのシンプルさと標準ライブラリが理想的になります。

Pythonの主な目的:柔軟性と使いやすさPythonの主な目的:柔軟性と使いやすさApr 17, 2025 am 12:14 AM

Pythonの柔軟性は、マルチパラダイムサポートと動的タイプシステムに反映されていますが、使いやすさはシンプルな構文とリッチ標準ライブラリに由来しています。 1。柔軟性:オブジェクト指向、機能的および手続き的プログラミングをサポートし、動的タイプシステムは開発効率を向上させます。 2。使いやすさ:文法は自然言語に近く、標準的なライブラリは幅広い機能をカバーし、開発プロセスを簡素化します。

Python:汎用性の高いプログラミングの力Python:汎用性の高いプログラミングの力Apr 17, 2025 am 12:09 AM

Pythonは、初心者から上級開発者までのすべてのニーズに適した、そのシンプルさとパワーに非常に好まれています。その汎用性は、次のことに反映されています。1)学習と使用が簡単、シンプルな構文。 2)Numpy、Pandasなどの豊富なライブラリとフレームワーク。 3)さまざまなオペレーティングシステムで実行できるクロスプラットフォームサポート。 4)作業効率を向上させるためのスクリプトおよび自動化タスクに適しています。

1日2時間でPythonを学ぶ:実用的なガイド1日2時間でPythonを学ぶ:実用的なガイドApr 17, 2025 am 12:05 AM

はい、1日2時間でPythonを学びます。 1.合理的な学習計画を作成します。2。適切な学習リソースを選択します。3。実践を通じて学んだ知識を統合します。これらの手順は、短時間でPythonをマスターするのに役立ちます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)