面向对象(一)
1) 1. 面向对象==(object-oriented ;简称: OO)== 至今还没有统一的概念 我这里把它定义为: 按人们 认识客观世 界的系统思维方式,采用基于对象(实体) 的概念建立模型,模拟客观世界分析、设 计、实现软件的办法。
2. 面向对象编程(Object Oriented Programming-OOP) 是一种解决软件复用的设计和编程方法。 这种方法把软件系统中相近相似的操作逻辑和操作 应用数据、状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。
2)类和对象
1. 类
• 人以类聚 物以群分。
• 具有相似内部状态和运动规律的实体的集合(或统称为抽象)。
• 具有相同属性和行为事物的统称
• 类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,使用这个具体的存在。
• 一个类可以找到多个对象
2. 对象
• 某一个具体事物的存在 ,在现实世界中可以是看得见摸得着的。
• 可以是直接使用的
3. 类和对象之间的关系
类就是创建对象的模板
4. 类的构成
类(Class) 由3个部分构成
01). 类的名称:类名
02). 类的属性:一组数据
03). 类的方法:允许对进行操作的方法 (行为)
5.类的定义
□ class Hero(object): # 新式类定义形式
□ def info(self):
□ print(“英雄各有见,何必问出处。”)
□ object 是Python 里所有类的最顶级父类;
® 类名 的命名规则按照"大驼峰命名法";
□ info 是一个实例方法,第一个参数一般是self,表示实例对象本身,当然了可以将self换为其它的名字,其作用是一个变量 这个变量指向了实例对象
6.创建对象
创建对象的格式为:
® 对象名1 = 类名()
® 对象名2 = 类名()
® 对象名3 = 类名()
7.添加和获取对象的属性
□ 在方法内通过self获取对象属性
8.魔法方法
1、init()方法
通常用来做属性初始化 或 赋值 操作
注意:
• 1. 在类内部获取 属性 和 实例方法,通过self获取;
• 2. 在类外部获取 属性 和 实例方法,通过对象名获取。
• 3 如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址;
4 但是实例方法是所有对象共享的,只占用一份内存空间。类会通过self来判断是哪个对象调用了实例方法。
2、str()方法
• 当使用print输出对象的时候,默认打印对象的内存地址。如果类定义了__str__(self)方法,那么就会打印从在这个方法中 return 的数据
• __str__方法通常返回一个字符串,作为这个对象的描述信息
•3、del()方法
• 1). 当有变量保存了一个对象的引用时,此对象的引用计数就会加1;
• 2). 当使用del() 删除变量指向的对象时,则会减少对象的引用计数。如果对象的引用计数不为1,那么会让这个对象的引用计数减1,当对象的引用计数为0的时候,则对象才会被真正删除(内存被回收)。
面向对象(二)
1)继承
单继承:子类只继承一个父类
• 子类在继承的时候,在定义类时,小括号()中为父类的名字
• 父类的属性、方法,会被继承给子类
□ 多继承:子类继承多个父类
• 多继承可以继承多个父类,也继承了所有父类的属性和方法
• 注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)
• 多个父类中,不重名的属性和方法,不会有任何影响。
□ 子类重写父类的同名属性和方法
□ 子类调用父类同名属性和方法
• 核心点:
• 无论何时何地,self都表示是子类的对象。在调用父类方法时,通过传递self参数,来控制方法和属性的访问修改。
□ 多层继承
◊ 继承大于一层的就叫多层继承
□ super()
◊ 只在多层继承中使用
面向对象(三)
• 面向对象三大特性:封装、继承、多态
1) 私有权限
• 在属性名和方法名 前面 加上两个下划线 __
□ 类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问;
□ 类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问;
□ 私有属性 和 私有方法 往往用来处理类的内部事情,不通过对象处理,起到安全作用。
2)私有属性和私有方法
□ 1). 私有属性,可以在类内部通过self调用,但不能通过对象访问
□ 2). 私有方法,可以在类内部通过self调用,但不能通过对象访问
□ 3). 对象不能访问私有权限的属性和方法
□ 4). 子类不能继承父类私有权限的属性和方法
□ 5). Python中没有像C++中 public 和 private 这些关键字来区别公有属性和私有属性。
□ 6). Python是以属性命名方式来区分,如果在属性和方法名前面加了2个下划线’__’,则表明该属性和方法是私有权限,否则为公有权限。
3)修改私有属性的值
□ 对象名.方法名() ----> 间接修改:
定义一个可以调用的公有方法,在这个公有方法内访问修改。
4)多态
定义:
1、发生继承
2、子类重写父类同名属性和方法
3、调用子类重写父类同名属性和方法
5)类属性和实例属性
实例属性:init(self)
类属性:类对象所拥有的属性(私有属性和公有属性)
• 总结:
• 如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。
• 如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。
6)静态方法和类方法
类方法:
1、是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法
2、类方法还有一个用途就是可以对类属性进行修改
静态方法:
◊ 需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,可以通过对象和类来访问。
• 总结
◊ 从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;
◊ 实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
◊ 静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类实例对象来引用
7)异常及模块
通用的捕获所有异常
Exception :
◊ try...finally...
无论异常是否产生都要执行
抛出自定义的异常:
raise引发一个你定义的异常---->主动抛出异常
模块
import来引入某个模块