欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python进阶笔记(一)万物皆对象

程序员文章站 2024-03-17 18:03:10
...

1.1 函数和类也是对象,属于python的一等公民

1. 可以赋值给一个变量:

# 函数可以给赋值为一个变量
def ask(name="bobby"):
	print(name)
my_func = ask
my_func("bobby")

# 类可以赋值为一个变量
class Person:
	def __init__(self):
		print("bobby1")
my_class = Person
my_class()

2. 可以添加到集合对象中:

obj_list = []
obj_list.append(ask)
obj_list.append(Person)
for item in obj_list:
	print(item())

输出为:
bobby
None
bobby1
<__main__.Person object at 0x106815080>
输出的含义分别为:
第一个为输出的函数,但因为输出的函数没有return,所以在第二个print时会返回None;
第三个是因为init函数,init函数本身是不返回实例的,但在实例化的时候,实际上是会返回类的对象。

3. 可以作为参数传递给函数

4. 可以当作函数的返回值:

def decorator_func():
	print("dec start")
	return ask
my_ask = decorator_func()
my_ask("tom")

输出为:
dec start
tom

1.2 type,object和class的关系

我们借助理解三者之间的关系来认识一切皆对象的含义:
Python进阶笔记(一)万物皆对象

在Python中,类本身是一个对象,而我们又可以用类来实例化对象:
在这里,1是通过int的类来实例化生成的对象,而int类本身又是一个对象,它是由type这个类来生成的。
我们可以总结为:
type生成了class,class生成了obj (这个obj就是我们平常静态语言中所描述的对象)
(生成的意思是实例)
这里的int是内建的一个类,那如果是我们自己定义的一个类呢?
Python进阶笔记(一)万物皆对象
由此可发现我们自定义的类和内建的类一样,依然符合上述的关系:
我们的类是由type这个类来生成的一个对象,我们平常所熟悉的对象是由我们的类对象来创建的一个对象。

所以type和类之间的关系就明白了,那另外一个object与它们有什么关系呢?
object实际上是所有类都要继承的一个最顶层的基础类:

Python进阶笔记(一)万物皆对象
如果我们不去继承任何类时,默认继承的是object类,所以object是最顶层基类,所有的类推到最后,都是继承object类。

但是type本身也是一个类,同时type也是一个对象。既然type是一个类,那么type的父类是什么呢?
我们通过.__bases__方法来查看type类所继承的父类:
Python进阶笔记(一)万物皆对象
可以看到,type类的父类是object基类,那么我们再看下object基类是由谁来生成的呢?
这里通过type来查看,因为python中一切都是对象,那么对于object这个基类而言,也是一个对象,type的含义就是看这个对象由什么类所生成的。

Python进阶笔记(一)万物皆对象
我们看到这里type和object形成了一个环路,即type类继承父类object,而object对象是由type类产生
我们用下面的图来解释整个过程:

Python进阶笔记(一)万物皆对象
虚线代表实例关系,实线代表继承关系。我们重点关注type和object的关系,理解了它们,再去理解python的一切皆对象就会非常的直观。

  1. object是type的一个实例,而所有的内置类,其实也都是由type创建出来的,所以说type创建了所有的类。而类是一个对象,其实这里的对象指的就是是type的对象。那么为什么是一个class的时候要把它做成一个对象呢?这就是python一切皆对象的设计理念,因为这里把它设计为对象之后,后期我们动态去修改我们看到的内置类的时候,就会比较简单。

  2. type继承了object,为什么说object是type的一个基类呢?毕竟连type都要去继承它。

  3. type也是自身的一个实例,连自己都成为了自己的对象了,所以其他的成为自己的对象就好理解了。

那么Python在实现一切皆对象的同时,还同时一切继承于object
那么为什么自己能够实例化自己呢?
这里可以通过指针来进行解释,可以通过底层指针来指向自己。

1.3 python中的内置类型

python中对象有三个特征:

1. 身份:

身份指的就是对象在内存中的地址
Python进阶笔记(一)万物皆对象

2. 类型:

None:python在解释器启动时,它会用None类型来生成一个None的对象,这个None对象全局只有一个,即如果a = None,b = None,那么a和b实际上是指向同一个None对象。
数值类型:int,float,complex,bool
迭代类型:迭代器
序列类型:list,range,tuple,str,array
映射:dict
集合:set,frozenset
上下文管理类型:with语句
其他类型:模块类型,class和实例,函数类型,方法类型,代码类型,object类型,type类型等;

3. 值:

a = 1 可以描述为值1被封装为int,然后由a这个变量所指向

Python进阶笔记(一)万物皆对象