Jadual Kandungan
回复内容:
Rumah pembangunan bahagian belakang Tutorial Python python的type和object之间是怎么一种关系?

python的type和object之间是怎么一种关系?

Jun 06, 2016 pm 04:22 PM
object python type

是初学者请勿喷啊
两个是互为实例的关系,但不是互为子类的关系,只有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 */
    ...
}
Salin selepas log masuk
谢邀,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>
Salin selepas log masuk
这部分我当初是读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>
Salin selepas log masuk
既不是互为实例:
>>> 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决定
Salin selepas log masuk
之前读过一篇讨论这个问题文章,链接已经丢了。。。建议题主读一读《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>
Salin selepas log masuk
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Muzium Dua Point: Semua Pameran dan Di Mana Mencari Mereka
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Adakah terdapat aplikasi mudah alih yang boleh menukar XML ke PDF? Adakah terdapat aplikasi mudah alih yang boleh menukar XML ke PDF? Apr 02, 2025 pm 08:54 PM

Permohonan yang menukarkan XML terus ke PDF tidak dapat dijumpai kerana mereka adalah dua format yang berbeza. XML digunakan untuk menyimpan data, manakala PDF digunakan untuk memaparkan dokumen. Untuk melengkapkan transformasi, anda boleh menggunakan bahasa pengaturcaraan dan perpustakaan seperti Python dan ReportLab untuk menghuraikan data XML dan menghasilkan dokumen PDF.

Bagaimana cara menukar fail XML ke PDF di telefon anda? Bagaimana cara menukar fail XML ke PDF di telefon anda? Apr 02, 2025 pm 10:12 PM

Tidak mustahil untuk menyelesaikan penukaran XML ke PDF secara langsung di telefon anda dengan satu aplikasi. Ia perlu menggunakan perkhidmatan awan, yang boleh dicapai melalui dua langkah: 1. Tukar XML ke PDF di awan, 2. Akses atau muat turun fail PDF yang ditukar pada telefon bimbit.

Adakah kelajuan penukaran cepat apabila menukar XML ke PDF pada telefon bimbit? Adakah kelajuan penukaran cepat apabila menukar XML ke PDF pada telefon bimbit? Apr 02, 2025 pm 10:09 PM

Kelajuan XML mudah alih ke PDF bergantung kepada faktor -faktor berikut: kerumitan struktur XML. Kaedah Penukaran Konfigurasi Perkakasan Mudah Alih (Perpustakaan, Algoritma) Kaedah Pengoptimuman Kualiti Kod (Pilih perpustakaan yang cekap, mengoptimumkan algoritma, data cache, dan menggunakan pelbagai threading). Secara keseluruhannya, tidak ada jawapan mutlak dan ia perlu dioptimumkan mengikut keadaan tertentu.

Bagaimana cara mengawal saiz XML ditukar kepada imej? Bagaimana cara mengawal saiz XML ditukar kepada imej? Apr 02, 2025 pm 07:24 PM

Untuk menjana imej melalui XML, anda perlu menggunakan perpustakaan graf (seperti bantal dan JFreechart) sebagai jambatan untuk menjana imej berdasarkan metadata (saiz, warna) dalam XML. Kunci untuk mengawal saiz imej adalah untuk menyesuaikan nilai & lt; lebar & gt; dan & lt; ketinggian & gt; Tag dalam XML. Walau bagaimanapun, dalam aplikasi praktikal, kerumitan struktur XML, kehalusan lukisan graf, kelajuan penjanaan imej dan penggunaan memori, dan pemilihan format imej semuanya mempunyai kesan ke atas saiz imej yang dihasilkan. Oleh itu, perlu mempunyai pemahaman yang mendalam tentang struktur XML, mahir dalam perpustakaan grafik, dan mempertimbangkan faktor -faktor seperti algoritma pengoptimuman dan pemilihan format imej.

Alat pemformatan XML yang disyorkan Alat pemformatan XML yang disyorkan Apr 02, 2025 pm 09:03 PM

Alat pemformatan XML boleh menaip kod mengikut peraturan untuk meningkatkan kebolehbacaan dan pemahaman. Apabila memilih alat, perhatikan keupayaan penyesuaian, pengendalian keadaan khas, prestasi dan kemudahan penggunaan. Jenis alat yang biasa digunakan termasuk alat dalam talian, pemalam IDE, dan alat baris arahan.

Apakah fungsi jumlah bahasa C? Apakah fungsi jumlah bahasa C? Apr 03, 2025 pm 02:21 PM

Tiada fungsi jumlah terbina dalam dalam bahasa C, jadi ia perlu ditulis sendiri. Jumlah boleh dicapai dengan melintasi unsur -unsur array dan terkumpul: Versi gelung: SUM dikira menggunakan panjang gelung dan panjang. Versi Pointer: Gunakan petunjuk untuk menunjuk kepada unsur-unsur array, dan penjumlahan yang cekap dicapai melalui penunjuk diri sendiri. Secara dinamik memperuntukkan versi Array: Perlawanan secara dinamik dan uruskan memori sendiri, memastikan memori yang diperuntukkan dibebaskan untuk mengelakkan kebocoran ingatan.

Cara Membuka Format XML Cara Membuka Format XML Apr 02, 2025 pm 09:00 PM

Gunakan kebanyakan editor teks untuk membuka fail XML; Jika anda memerlukan paparan pokok yang lebih intuitif, anda boleh menggunakan editor XML, seperti editor XML oksigen atau XMLSPY; Jika anda memproses data XML dalam program, anda perlu menggunakan bahasa pengaturcaraan (seperti Python) dan perpustakaan XML (seperti XML.Etree.ElementTree) untuk menghuraikan.

Adakah terdapat aplikasi mudah alih yang boleh menukar XML ke PDF? Adakah terdapat aplikasi mudah alih yang boleh menukar XML ke PDF? Apr 02, 2025 pm 09:45 PM

Tiada aplikasi yang boleh menukar semua fail XML ke dalam PDF kerana struktur XML adalah fleksibel dan pelbagai. Inti XML ke PDF adalah untuk menukar struktur data ke dalam susun atur halaman, yang memerlukan parsing XML dan menjana PDF. Kaedah umum termasuk parsing XML menggunakan perpustakaan python seperti ElementTree dan menjana PDF menggunakan perpustakaan ReportLab. Untuk XML yang kompleks, mungkin perlu menggunakan struktur transformasi XSLT. Apabila mengoptimumkan prestasi, pertimbangkan untuk menggunakan multithreaded atau multiprocesses dan pilih perpustakaan yang sesuai.

See all articles