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一切皆对象相关推荐

  1. python一切皆对象对吗_Python 一切皆对象的本质

    尝试用python的概念,解释python自身的底层原理 class PyObject: def __init__( self, ob_refcnt=1, ob_type=None ): self.o ...

  2. python内置对象的实现_Python 内置对象的实现

    准备回顾一下python源代码,不过不准备说的太细,尽量勾勒框架,不引用代码. python中所有东西都是对象,进一步地,这些对象可以分为类型对象(type)or实例对象,有时一个对象即可以是类型,也 ...

  3. python中组合与继承的区别_python类与对象的组合与继承

    1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于"有一个"的场景中,继承 ...

  4. python可迭代对象 迭代器生成器_Python可迭代对象、迭代器和生成器

    8.1 可迭代对象(Iterable) 大部分对象都是可迭代,只要实现了__iter__方法的对象就是可迭代的. __iter__方法会返回迭代器(iterator)本身,例如: >>&g ...

  5. python类与对象做项目_python 类和对象

    一.编程范式 1.面向对象编程: 2.面向过程编程: 3.函数式编程 二.面向对象设计 面向对象设计:将一类具体事物的数据和动作整个到一起; 1.我们都学过函数,那么使用函数该怎么实现面向对象设计呢? ...

  6. python中对象的特性_python中类与对象之继承,python类和对象理解,面对对象的三大特性之...

    python中类与对象之继承,python类和对象理解,面对对象的三大特性之 面对对象的三大特性之继承 1.什么是继承? 在程序中,继承指的是class与class之间的关系 继承是一种关系,必须存在 ...

  7. python中不可迭代对象有哪些_python可迭代对象

    本身实现了迭代方法的对象称之为可迭代对象,可迭代对象特点: 支持每次返回自己所包含的一个成员的对象: 对象实现了 __iter__ 方法: 所有数据结构都是可迭代对象: for 循环要求对象必须是一个 ...

  8. python迭代对象有哪些_Python可迭代对象操作示例

    本文实例讲述了Python可迭代对象.分享给大家供大家参考,具体如下: 1.列表生成式 list = [result for x in range(m, n)] g1 = (i for i in ra ...

  9. python 类 对象 知乎_python基础知识:类,对象,模块三者的区别

    长话短说,我线代作业还没有写呢. 有点编程语言知识的朋友应该知道,编程语言有"面向对象"和"面向过程"两种. 解释一下:面向对象技术是目前流行的系统设计开发技术 ...

最新文章

  1. Oracle四舍五入,向上取整,向下取整
  2. 【洛谷】马的遍历--广度优先搜索(BFS)
  3. 百度语音识别合成案例
  4. Swift - 14 - 字符串的基础操作
  5. POJ - 3273 Monthly Expense(二分水题)
  6. redux 和 mobX对比
  7. C++中extern关键字的作用
  8. execve系统调用_张凯捷—系统调用分析(3) (基于最新Linux5.0版本系统调用日志收集系统)...
  9. android monkey优化,GitHub - baozhida/AndroidMonkey: 这个项目是CrashMonkey4Android可执行文件,修复了一些bug,做了一些优化...
  10. 三角形判断(信息学奥赛一本通-T1054)
  11. Jupyter Notebook命令行启动报错: DLL load failed
  12. 心跳脑裂解决方案之Heartbeat的Stonith配置
  13. Hadoop大数据简介
  14. DTFT和DFT有何区别?一文为你讲解清楚
  15. 正则表达式之基本原理
  16. 甘肃省房屋过户费用计算机,2017二手房过户费计算器
  17. STM32f429开发中USB读写文件涉及到的库移植
  18. qemu 规范路径_EVE-NG镜像添加技巧(以思科虚拟化产品为例)
  19. 解决WPS公式上浮问题
  20. codeup刷题 2.6小节——C/C++快速入门->函数 ——《算法笔记》(胡凡)

热门文章

  1. SurfaceFlinger 和 WindowManager
  2. Android解压boot.img
  3. Pulseaudio实用命令(二)
  4. 详解c++[指针的指针] 和 [指针的引用]
  5. Clojure 学习入门(10)- httpkit
  6. SpringBoot之idea快捷键
  7. 威纶通宏开机后使用初始化宏指令_你按下电脑开机键后,电脑都干了些什么?...
  8. 怎么锁定电脑屏幕_锁定流行趋势,信霆为你盘点3C数码配件中的人气单品
  9. linux服务器学习笔记:linux忘记密码怎么办?
  10. move_uploaded_file返回false但实际成功_023 Spring Boot 搭建实际项目开发框架