Python中一切都是对象,那么类本身作为对象时,它的类又是什么?
目前只能理解,数据类型是类,如 int 类,str 类等。
Python中一切都是对象,那么类本身作为对象时,它的类又是什么?
类是某一类对象的共有特征,"abc"是 string 类的对象
在Python里,类本身确实是对象,它是type类的实例。type是一个元类(metaclass),所有类(包括type自身)都由它创建。你可以用type()来动态创建类,或者用__class__属性查看类的类型。
class MyClass:
pass
obj = MyClass()
print(type(obj)) # <class '__main__.MyClass'>
print(type(MyClass)) # <class 'type'>
print(type(type)) # <class 'type'> # type自身的类型也是type
简单说,type是创建所有类的工厂,包括它自己。这就是为什么type(type)返回的还是type,形成了一个自举的闭环。元类机制允许你在类创建时进行干预,但日常开发中很少需要直接操作它。
总结:类的类是type。
我实例化我自己
我觉得类不是对象,类是对象的描述。
类是 type 类的实例,type 是自身的实例。
type 吧
>>> object
<class ‘object’>
>>> object
<class ‘object’>
>>> type(object)
<class ‘type’>
>>> type
<class ‘type’>
>>> type(type)
<class ‘type’>
>>>
元类了解一下。
你抛开编程中的概念来思考会好一些,一个东西是类还是对象只是看的角度不同而已,比如模具相对于通过自己造出来的东西是类,而相对于造自己的模具来说就是对象了
刚学不用考虑一切皆对象这句话,不影响写代码
你管他是啥?多写点代码
类是对象的描述,对象是类的实例。
for 是对象吗?一切都是对象?
Python 类的类型也是类型,没什么元类这种东西。具体参考 CPython 源码。
倒是 C 实现的类型和 Python 实现的类型本质上有区别,虽然表面上差不多,也能做继承。
和 “类” 对应的是 “类的实例”
类就是不想说话
Universe types
https://en.wikipedia.org/wiki/Type_theory#Universe_types
type is type
在 Python 中一切都是对象,包括常见的基本数据类型、函数、方法、迭代器、生成器、模块等等。
Python 对象模型:
https://i.loli.net/2018/09/07/5b91d72d7b107.png
#14 PyTypeObject 可以理解为元类吧。
《 Python 源码剖析》这本书可以看一下。此外可以了解一下 metaclass 这个概念。type 就是 metaclass。metaclass 是 class 的 class。class 是 metaclass 的实例。例如 str, list, int 是 type 的实例。
class MyClass:
pass
这个 MyClass 默认继承 object,object 也是 type 的实例。my_instance = MyClass(),这里,MyClass 是 class。my_instance 是 MyClass 这个 class 实例化的结果。
晕了么?😁
参考资料:
- 《 Python 源码剖析》: https://book.douban.com/subject/3117898/
- “新式类”: https://www.python.org/doc/newstyle/
在 Python 中,类是一种抽象的理念,在源码并不存在某个 class 的定义,因为类这个抽象理念在 Python 运行时中被实例化,Python 依靠运行时中的类实例来生成自己的对象实例,而不需要在代码中定义类的实现然后编译后在运行时载入内存。在 Python 的底层实现中,如 CPython,就对各个类的实现做了定位,比如 PyIntType,它在 Python 中对应的就是 int 类型,而各种类型实例对应 C 中的实现就是 PyIntobject。
Python 中所有东西都是对象,比较特殊的是:object 和 type 是 python 中的两个源对象,它们是互相依赖对方来定义,不能分割来说,
就如同讨论“先有鸡还是现有蛋”,一样让人蛋疼。
先介绍有两个黑魔法在后面要用到:
obj.bases 指这个对象的父类,就是说从谁继承来的。
obj.class 指这个对象的类型,类的类型是 type
Python 的面向对象系统有两条线索。
1.继承关系也就是父类和子类的关系( the subclass-superclass relationship ),以 object 为起点;
所有对象的父类是 object,因此 object 是没有父类的。
>>> object.bases
()
type 也是 object 的子类
>>> issubclass(type, object)
True
>>> type.bases
(<class ‘object’>,)
2.类型和实例之间的关系( the type-instance relationship ),以 type 为起点。
type 是自身的实例,或说 type (对象 object )的 class (类型 type )是 type
>>> isinstance(type, type)
True
>>> type(type)
<class ‘type’>
>>> type.class
<class ‘type’>
就连 object 都是 type 的实例
>>> isinstance(type, object)
True
总结一下:
type 是一个比较特殊的类,这里引出另一概念元类,普通类实例化出来一个对象,但是元类实例化出来的是一个类,
int、float、str、boolean、tuple、dict、set 等内置的数据类型其实也就是内置的类都是 type 实例。
>>> isinstance(int, type)
True
>>> int.class
<class ‘type’>
>>>
object 是所有对象(包括类对象)的父类,int、float、str、boolean、tuple、dict、set 内置类都是 object 子类。
>>> int.bases
(<class ‘object’>,)
>>> isinstance(int, object)
True
楼上总结的很好。
但我总觉得 type 更早一些。谁来讲讲旧式类?当时 object 还没有强制使用。
Python 中只有 2 种对象,类和非类
看点 python 源码实现就对"一切都是对象" 这种模糊的描述更清晰了. 举一个简单的例子两个 int 相加, 伪代码如下:
PyObject * Interger_Add(PyObject* left, PyObject* right) {
PyIntObject* int_left = (PyIntObject*) left;
PyIntObject* int_right = (PyIntObject*) left;
PyIntObject* int_new = (PyIntObject*) Py_GC_MALLOC(&PyIntObject);
}
看点 python 源码实现就对"一切都是对象" 这种模糊的描述更清晰了. 举一个简单的例子如两个 int 相加, 伪代码如下:
PyObject * Interger_Add(PyObject* left, PyObject* right) {
PyIntObject* int_left = (PyIntObject*) left;
PyIntObject* int_right = (PyIntObject*) left;
PyIntObject* int_new = (PyIntObject*) Py_GC_MALLOC(&PyIntObject); # 在 malloc 之后做一些如添加引用计数等工作
int_new->ob_data = int_left->ob_data + int_right->ob_data; # ob_data 为 c long 类型
return (PyObject*) int_new;
}
你看, 一个 两个 int 型相加, 参数传进来的是 PyObject , 返回的是 PyObject. 一切都是对象是不是更好理解了.
还有 Python 的 module 是怎么也是对象. 也有类似这样的函数, PyObjcet* model_reload(PyObject* module);
你看重载 module, 参数传进来的都是 PyObject, 返回的也是 PyObject, 一切都是对象是不是更清晰了?
如果不从 Python 源码来理解的话, 你就要区分 object 这个关键词 python 与 c++和 java 中的区别, object 在 c++和 java 中的概念更像是 python 中 实例(instance) 的概念.
在面向对象编程概念里, 类是抽象数据和与这些抽象数据相关操作的集合, 对象是类的实例, 也就是具体数据和构建在这些具体数据上的集合. 这个概念与 python 中一切都是对象是完全不在一个层面上的比较.
面向对象是一种抽象, 他与语言是无关的, 任何语言都能实现面向对象中的至少一部分想法. 而"一切都是对象" 这句话描述的不是抽象, 而是具体的实现.
python 通过 PyObject 实现了面向对象这个抽象的思想. 所以在一些地方借鉴了思想的关键字. 如 class, object. 但是这些词并不是严格对应面向对象的概念, 因为 python 是多范式的编程语言.
所以把"一切都是对象"中的对象和面向对象编程中的对象 这两个对象区分开, 才能理解 python 中一切都是对象, 这个概念.
P.S. v2 的编辑器真是垃圾.
#21 但 CPython 实现上并没有说 Type 这个 class 比其他 class 高一档或者有很多的特殊之处。metaclass 这个概念其实更多的是一种 class hack 或者是 injection


