python一切都是对象 知乎_python一切皆对象
1. 一切皆对象
1.1 先了解类
故事要从一切皆对象开始讲起,与对象相伴的一个概念叫类,类就好比模板,对象都是根据这个模板刻画衍生出来的。
比如下面这行简单的代码
a = int('3')
print(a, type(a))
程序最终输出结果是
3
虽然各类教程,包括python官方文档里将int()称之为内置函数,但你查看源码可以发现,它其实是类
class int(object):
"""int(x=0) -> integerint(x, base=10) -> integer"""
你平时在程序里的各种整型数据,都是这个类生成的,这个类是python提供给我们的,而且我们不用关心对象的创建过程。
1.2 自己定义的类
我们可以自己创建类,然后用这个类去创建对象
class MyClass:
def print(self):
print("自己创建的类")
mc = MyClass()
print(mc, type(mc))
程序输出结果
在面向对象的概念里,mc就是一个对象,MyClass是类,一个类可以生成很多个对象。
1.3 类也是对象
前面介绍了python提供的类和我们自己定义的类,你已经知道类可以生成对象,现在突然告诉你,类也是对象,你肯定感觉有丈二和尚摸不着头脑。
咱们打个比方,mc是儿子,MyClass就是爸爸,现在告诉你,MyClass也是儿子,你还糊涂么?MyClass也是儿子,那它的爸爸是谁呢?
咱们可以用type函数寻找它的爸爸
class MyClass:
def print(self):
print("自己创建的类")
mc = MyClass()
father = type(mc)
print(father)
grandfather = type(father)
print(grandfather)
print(type(grandfather))
程序输出结果
从输出结果,我们可以推导出如下结论mc的爸爸是MyClass
MyClass的爸爸是type
type的爸爸是它自己
惊不惊喜,意不意外,type也是一个类
class type(object):
"""type(object_or_name, bases, dict)type(object) -> the object's typetype(name, bases, dict) -> a new type"""
在python中,不管是什么东西,只要你用type去追踪寻找它的爸爸,最终的线索都指向type,一个type不够用,就再加一个type,不行就再加
print(type(3))
print(type(type(3)))
def test():
pass
print(type(test))
print(type(type(test)))
class T:
pass
print(type(T))
程序输出结果
int类型是对象,函数是对象,我们自己定义的类也是对象,他们的类型都是type,type是个万能的类啊,就连type自己都是对象,所以才有python一切皆对象。
1.4 梳理一下思路
普通对象,例如我们自己创建的mc,mc的类型是类,而类的类型就叫做元类(metaclass), 普通的类,可以生成对象,对象也可以称之为实例,元类是类,当然也可以生成对象,元类生成的对象就是我们创建的普通类。
2. 类的创建
2.1 直接定义一个类
想要创建一个类,你可以直接定义它
class MyTest:
def __init__(self, name):
self.name = name
mt = MyTest('mytest')
print(mt.name)
2.2 使用type创建
既然,MyTest的类型是type, MyTest是type的一个实例,那么我们就可以通过type这个类来生成它,用type生成一个类并不难,其构造函数如下
type(name, bases, dict):name 是类的名字
bases 是继承的类
dict 存放类的属性和方法
现在,用type来创建一个类,和上面定义的MyTest一模一样的类
def init(self, name):
self.name = name
mytest_class = type('MyTest', (), {'__init__': init})
mt = mytest_class('mytest')
print(mt.name)
程序输出结果
mytest
看明白了吧,type是类MyTest 的元类
2.3 类的创建过程
2.2 小节中,我直接用type去创建类,而在2.1小节中,我只是直接定义了一个类,似乎和type没有关系,其实不然。
当程序启动后,python解释器会解释执行这些代码,类的创建包含下列过程遇到class 关键字时,要解析对类的定义,如果没有指定metaclass,那么metaclass 就默认使用type
准备namespace,如果元类实现了 __prepare__ 函数,则会调用它来得到默认的 namespace, 如果没有实现,创建一个空的有序字典作为namespace
调用exec 来执行类的body,类的属性和方法最终都会保存到namespace中
调用类的构造函数来创建类
知道了类的创建过程,知道了元类控制着类的创建,也知道了默认情况下元类是type且这个元类是可以设置的,那么如果你想对类的创建过程进行控制,进行有目的的定制操作,就可以通过元类来进行。
python一切都是对象 知乎_python一切皆对象相关推荐
- python一切皆对象对吗_Python 一切皆对象的本质
尝试用python的概念,解释python自身的底层原理 class PyObject: def __init__( self, ob_refcnt=1, ob_type=None ): self.o ...
- python内置对象的实现_Python 内置对象的实现
准备回顾一下python源代码,不过不准备说的太细,尽量勾勒框架,不引用代码. python中所有东西都是对象,进一步地,这些对象可以分为类型对象(type)or实例对象,有时一个对象即可以是类型,也 ...
- python中组合与继承的区别_python类与对象的组合与继承
1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于"有一个"的场景中,继承 ...
- python可迭代对象 迭代器生成器_Python可迭代对象、迭代器和生成器
8.1 可迭代对象(Iterable) 大部分对象都是可迭代,只要实现了__iter__方法的对象就是可迭代的. __iter__方法会返回迭代器(iterator)本身,例如: >>&g ...
- python类与对象做项目_python 类和对象
一.编程范式 1.面向对象编程: 2.面向过程编程: 3.函数式编程 二.面向对象设计 面向对象设计:将一类具体事物的数据和动作整个到一起; 1.我们都学过函数,那么使用函数该怎么实现面向对象设计呢? ...
- python中对象的特性_python中类与对象之继承,python类和对象理解,面对对象的三大特性之...
python中类与对象之继承,python类和对象理解,面对对象的三大特性之 面对对象的三大特性之继承 1.什么是继承? 在程序中,继承指的是class与class之间的关系 继承是一种关系,必须存在 ...
- python中不可迭代对象有哪些_python可迭代对象
本身实现了迭代方法的对象称之为可迭代对象,可迭代对象特点: 支持每次返回自己所包含的一个成员的对象: 对象实现了 __iter__ 方法: 所有数据结构都是可迭代对象: for 循环要求对象必须是一个 ...
- python迭代对象有哪些_Python可迭代对象操作示例
本文实例讲述了Python可迭代对象.分享给大家供大家参考,具体如下: 1.列表生成式 list = [result for x in range(m, n)] g1 = (i for i in ra ...
- python 类 对象 知乎_python基础知识:类,对象,模块三者的区别
长话短说,我线代作业还没有写呢. 有点编程语言知识的朋友应该知道,编程语言有"面向对象"和"面向过程"两种. 解释一下:面向对象技术是目前流行的系统设计开发技术 ...
最新文章
- Oracle四舍五入,向上取整,向下取整
- 【洛谷】马的遍历--广度优先搜索(BFS)
- 百度语音识别合成案例
- Swift - 14 - 字符串的基础操作
- POJ - 3273 Monthly Expense(二分水题)
- redux 和 mobX对比
- C++中extern关键字的作用
- execve系统调用_张凯捷—系统调用分析(3) (基于最新Linux5.0版本系统调用日志收集系统)...
- android monkey优化,GitHub - baozhida/AndroidMonkey: 这个项目是CrashMonkey4Android可执行文件,修复了一些bug,做了一些优化...
- 三角形判断(信息学奥赛一本通-T1054)
- Jupyter Notebook命令行启动报错: DLL load failed
- 心跳脑裂解决方案之Heartbeat的Stonith配置
- Hadoop大数据简介
- DTFT和DFT有何区别?一文为你讲解清楚
- 正则表达式之基本原理
- 甘肃省房屋过户费用计算机,2017二手房过户费计算器
- STM32f429开发中USB读写文件涉及到的库移植
- qemu 规范路径_EVE-NG镜像添加技巧(以思科虚拟化产品为例)
- 解决WPS公式上浮问题
- codeup刷题 2.6小节——C/C++快速入门->函数 ——《算法笔记》(胡凡)
热门文章
- SurfaceFlinger 和 WindowManager
- Android解压boot.img
- Pulseaudio实用命令(二)
- 详解c++[指针的指针] 和 [指针的引用]
- Clojure 学习入门(10)- httpkit
- SpringBoot之idea快捷键
- 威纶通宏开机后使用初始化宏指令_你按下电脑开机键后,电脑都干了些什么?...
- 怎么锁定电脑屏幕_锁定流行趋势,信霆为你盘点3C数码配件中的人气单品
- linux服务器学习笔记:linux忘记密码怎么办?
- move_uploaded_file返回false但实际成功_023 Spring Boot 搭建实际项目开发框架