一. 一切皆对象
相比于静态语言,作为动态语言的Python,面向对象更加彻底。在Python中,类和函数也是对象,而且时Python中的“一等公民”——1.可以赋值给一个变量。2. 可以添加到集合对象中。3. 可以作为参数传递给函数。4. 可以当作函数的返回值。
二. type,object,和class的关系
包括Python中自带的类,以及自定义的类,class都是由按照type生成的,也就是说所有的class都是type的实例化对象;而type本身也是一个类,是自身的实例化对象。
同时无论是type,还是class,他们的父类都是object,也就是说他们都继承object。因为object是所有其它类的父类,所以称为基类,而且它也是type的实例化对象。
注:python一切皆对象的绝佳体现就是type,我们可以看到object是type的实例化对象,class们也是type的实例化对象,type自己也是自身的实例化对象——>一切皆对象
三. Python中的常见内置类型
1.对象的三个特征:身份(内存地址),类型,值。
2.None——全局只有一个
3.数值类型:int,float,complex,bool
4. 迭代类型:可遍历。
5. 序列对象:
list,range,tuple,str,array,bytes,bytearrays,memoryview(二进制序列)
6.映射(dict)类型:
key,map(map(function, iterable, ...)对每一个可迭代对象调用function
7.集合类型:
set,frozenset(这里要强调,集合和字典都是通过引用来实现的,所以执行效率高,在代码中应该优先使用二者。)
8. 上下文管理类型
9. 其它:
模块类型,class和实例,函数类型,方法类型,代码类型,object对象,type类型,ellipsis类型,notimplemented类对象
四. 方法和函数的区别
类里面的是方法,类外面的是函数,调用方法只能通过类或者该类的实例化对象。
五. 动态语言和静态语言的区别和优势
1 灵活,动态语言对类型限制非常小,很多场景下,灵活是第一位的,比如频繁修改的gui,不限制类型,对gui开发具有相当大的灵活度。静态语言对类型要求严格,导致实现同样的功能,比动态语言麻烦的多。
2 写各种验证类工具,灵活也是排第一位的,验证类工具,大量的时间花在调参或修改上,动态语言调参或修改后,马上就可以运行,而静态语言还需要编译,在这种场景下,动态语言节省了大量时间。
3 写各种一次性运行脚本,或运行时间很短的脚本,或对各种异常的容忍度较高,就算出错了,也不会引起大事件。比如定时收集性能参数的脚本。比如一个下载脚本,下载出错了,直接退出报告用户就行了。服务类的程序是不能这样的。
4 劣势就是动态语言的类型系统是很弱的,这是动态语言N多问题的根源,包括做项目费劲。
六. 魔法函数
所谓魔法函数,实际上是python中的数据类型,python中的魔法函数其实本身就存在,我们拿出来只不过是进行了重写,在使用的时候不需要我们去主动调用,会自动触发。 比如len(),它读取列表的长度并不是去遍历了列表,而是直接从底层读到该列表的长度数据,所以性能高,因而像魔法一样,故得其名。
七. 鸭子类型
会在序列中提到。
八. 抽象基类(abc模块)
1.定义
在子类中直接继承或重载该父类的方法,这样减少了代码的重用性,提高了代码的共享能力。这里的父类就是抽象基类,他不会实例化,只是作为一个“接口”存在。
2.什么是接口
接口(interface)是对象公开方法的一种集合,在Java中通常以interface关键字来定义。接口虽然实现过程和抽象基类相似,但是却具有不同的概念。
3.类与接口的不同
a. 类实现了对象的方法和属性,接口制定了使用该接口需要实现哪些方法,声明,并不实现。
b. 类可以实例化,接口不可以实例化。
c. 类中的方法都可以实现,但是接口中的方法都只是声明,不具体实现该方法,实现由子类来实现
4. 抽象基类的好处
a. 处理继承问题方面更加规范,系统。
b. 明确调用之间的相互关系。
c. 使得继承层次更加清晰。
d. 限定子类是实现的方法。
5. 抽象基类概述
必须包含一个抽象函数(纯虚函数);它是一个不完整的类;它有已经被实现的方法;也有需要子类重写的方法。
使用场景:子类们要继承父类中的属性和方法,这样使得层次清晰,代码清楚易读,其实这些是普通继承也应具有的功能,而抽象基类具有更高阶的功能,也是区别于普通继承的功能:使得每个组件(子类)都需要按照指定的规范来实现特定的方法,限定功能。
举例:实现数据中台的开发,我们提供一个对外接口让不同组件通过接口来访问数据库,不同的组件都有一个统一的需求就是读取数据。那么我们可以将读取数据这个功能声明为抽象方法,执行SQL语句也是每个子类需要实现的,可以声明为抽象的静态方法。
实现:
Python标准库中有一个模块abc可以实现抽象基类和抽象方法。
抽象基类:通过继承abc模块中的ABC类来实现抽象基类。
抽象方法:通过装饰器的方法来调用abc模块中的abstractmethod方法来注解抽象基类的方法(abstractmethod注解除了可以实现抽象方法外,还可以注解类方法@classmethod,静态方法@staticmethod,属性@property。
注:Python标准库中abc模块实现了抽象基类,collections中也实现了抽象基类,numbers中也定义了有关数字对象的抽象基类。
九. isinstance和type
判断简单的数据类型可以用type,验证类和函数等推荐使用isinstance。
十. 类变量和实例变量
查找办法:Python3中——>C3算法。
十一. 类方法,静态方法和实例方法
类中采用普通书写模式的方法都是实例方法。
@staticmethod装饰器下为静态方法。
@classmethod装饰器下为类方法。
十二. mixin继承
是一种编程模式,在python等面向对象的编程语言中,它通常是已经实现某个功能单元的类,用于被其它类继承,来实现功能组合。
mixin模式特点:mixin类功能单一;不和基类关联,可以和任意基类组合;在mixin中不要使用super这种方法。
十三. 上下文管理系统
首先我们自定义一个类:
# 在该类中enter方法是获取资源并返回实例本身;exit方法是释放资源,退出;do_something是打开后的操作。
我们只需要用with语句调用do_something方法,其余的打开和关闭文件的操作通过Sample里的enter和exit方法即可以实现:
# 为了进一步简化上下文管理器的实现方式,python还提供了一个contextmanager的装饰器。
通过yield将函数分割成两部分,yield之前的语句在enter方法中执行,yield之后的语句在exit方法中执行。紧跟在yield后面的值是函数值:
在使用with语句调用该函数即可