一、面向对象(Objected-Oriented)
- 与面向过程相对,过程式的编程方式,很难用程序来表示许多个体,个体有一些数据、动作,个体之间还有包含关系。
- OOP三大特性,封装、继承、多态(Encapsulation、Inheritance、Polymorphisn)
- OOP里,所有的对象都应该有一个类。
- OOP可扩展性高,复杂程度高
- 在面向对象领域最先取得辉煌成功的是C++语言。
- Java向着更纯粹的面向对象范式靠拢。
- Python也是一门面向对象语言,但是也允许程序员以纯粹的面向过程的方式来使用它。
二、类(Class)
-
类的属性(Attribute),数据属性、方法属性
-
将东西根据属性归类,将object归为class
-
方法(Method)也是一种属性,表示动作
class Bird(object): have_feather = True way_of_reproduction = 'egg' def move(self, dx, dy): position = [0,0] position[0] = position[0] + dx position[1] = position[1] + dy return position
三、对象(Object)
- 建立一个对象(实例化): 对象名 = 类名()
- 程序中,对象就是变量。对象=数据+方法(Data+Method)
- 一个对象都至少有一个接口(interface),接口用于连接外部信息和隐藏内部信息(Communication和Protection)
四、继承(Inheritance)–派生、重用、组合
A、B都是一个类:
-
继承:A是B,那么A就继承了B。
-
派生:除了B以外的属性,A还可以有别的属性,这就叫派生。如果该属性B也有,那么以A派生出的新的属性为准。
-
重用:B里的某个方法属性A想调用,但又有所添加,那么在派生新的方法属性时,可以重用B的属性。
两种方法实现重用:
1.指名道姓Hero.attack(self,enemy)
2.super() 依赖继承
super().attack(enemy) --python3 super(Garen,self).attack(enemy) --python2
-
组合:A有B的属性,那么把B作为一个属性添加到A里。
继承的属性查找:
- 在Java和C#里,子类只能继承一个父类,而python可以继承多个父类。
- 查找方法有两种:深度优先(用于经典类,先找大爸的祖宗,再找二爸的祖宗)和广度优先(用于新式类)。
- python2里,有经典类(没有继承object的类)和新式类(继承object的类)
- python3里,都是新式类
- 新式类,有mro()方法,可以用于查看该类继承属性查找的顺序
抽象化与归一化
借用第三方库abc模块可以实现方法名字的归一化
improt abc
class Animal(mataclass=abc.ABCMeta):
@abc.abstractmethod
def talk(self):
pass
五、多态(Polymorphisn)
- 多态:
- 多态性:
六、封装(Encapsulation)
- 在类中,变量名前加__,可以把变量隐藏。
- 在类外部无法直接使用obj.__AttrName
- 在类内部可以直接使用obj.__AttrName
- 子类无法覆盖父类__开头的属性
七、property、绑定与非绑定、反射、抽象类
property
- 在方法前加@property,可以实现调用方法不加括号。
- setter和deleter可以实现改和删
绑定与非绑定
绑定方法:绑定给谁,就由谁来调用,并且把调用者当做第一个参数传入
- 绑定对象的方法:在类内定义的没有被任何装饰器装饰的方法
- 绑定类的方法
@classmethod
可以避免由于类名更改而影响需要调用类的地方
不需要实例化也能调用
非绑定方法:不与类或者对象绑定
@staticmethod
相当于一个普通函数
反射
通过字符串映射到对象的属性
查询有无:hasattr(obj,name),返回True/False
调用:getattr(obj,name,default)
改:setattr(obj,name,value)
删:delattr(obj,name)
八、内置方法
类的专有方法:
¥__init__ :构造函数,在生成对象时执行
¥__del__ :析构函数,释放对象时使用
¥__repr__ : 打印,转换
¥__getitem__: 按照索引获取值,可以用于
¥__setitem__ : 按照索引赋值,可以用于
¥__delitem__: 删除索引时调用
¥__len__: 获得长度
¥__cmp__: 比较运算
¥__call__: 函数调用,实例化时执行(先造一个空对象obj,初始化obj,返回obj)
¥__new__:用于类内部实例化对象
¥__str__: 打印对象的时候执行,print(obj)
九、面向对象的软件开发
1.面向对象分析
需求分析-归纳对象-建立需求模型
2.面向对象设计
类的设计(属性+方法)-设计类的层级(利用继承与派生)-程序设计
用流程图描述
3.面向对象编程
写代码
4.面向对象测试
5.面向对象维护