Python进阶笔记(一)万物皆对象
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中,类本身是一个对象,而我们又可以用类来实例化对象:
在这里,1是通过int的类来实例化生成的对象,而int类本身又是一个对象,它是由type这个类来生成的。
我们可以总结为:
type生成了class,class生成了obj (这个obj就是我们平常静态语言中所描述的对象)
(生成的意思是实例)
这里的int是内建的一个类,那如果是我们自己定义的一个类呢?
由此可发现我们自定义的类和内建的类一样,依然符合上述的关系:
我们的类是由type这个类来生成的一个对象,我们平常所熟悉的对象是由我们的类对象来创建的一个对象。
所以type和类之间的关系就明白了,那另外一个object与它们有什么关系呢?
object实际上是所有类都要继承的一个最顶层的基础类:
如果我们不去继承任何类时,默认继承的是object类,所以object是最顶层基类,所有的类推到最后,都是继承object类。
但是type本身也是一个类,同时type也是一个对象。既然type是一个类,那么type的父类是什么呢?
我们通过.__bases__方法来查看type类所继承的父类:
可以看到,type类的父类是object基类,那么我们再看下object基类是由谁来生成的呢?
这里通过type来查看,因为python中一切都是对象,那么对于object这个基类而言,也是一个对象,type的含义就是看这个对象由什么类所生成的。
我们看到这里type和object形成了一个环路,即type类继承父类object,而object对象是由type类产生。
我们用下面的图来解释整个过程:
虚线代表实例关系,实线代表继承关系。我们重点关注type和object的关系,理解了它们,再去理解python的一切皆对象就会非常的直观。
-
object是type的一个实例,而所有的内置类,其实也都是由type创建出来的,所以说type创建了所有的类。而类是一个对象,其实这里的对象指的就是是type的对象。那么为什么是一个class的时候要把它做成一个对象呢?这就是python一切皆对象的设计理念,因为这里把它设计为对象之后,后期我们动态去修改我们看到的内置类的时候,就会比较简单。
-
type继承了object,为什么说object是type的一个基类呢?毕竟连type都要去继承它。
-
type也是自身的一个实例,连自己都成为了自己的对象了,所以其他的成为自己的对象就好理解了。
那么Python在实现一切皆对象的同时,还同时一切继承于object。
那么为什么自己能够实例化自己呢?
这里可以通过指针来进行解释,可以通过底层指针来指向自己。
1.3 python中的内置类型
python中对象有三个特征:
1. 身份:
身份指的就是对象在内存中的地址
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这个变量所指向
上一篇: 递归-放苹果