第五章python面向对象基础详解
一.理解面向对象
面向对象就是将编程当成一个事物,对外界来说,事物是直接使用的,不用去管内部情况。编程就是设置事物做什么事情。
二、类和对象
- 对象是类的实例,类是一个抽象的概念
- 开发中先有类在有对象
- 创建类的语法
class 类名(): //类名命名规则为大驼峰
代码 - 创建对象的语法
对象名 = 类名() - self//指的是调用该函数的对象
- 一个类可以创建多个对象,self内存地址不相同
三、添加和获取对象属性
类外
类内
- 类外添加对象属性
语法:对象名.属性名 = 值 - 类外面获取对象属性的值
对象名.属性名 - 类内获取对象属性
self.属性名
四、魔法方法
__ xx __()的函数叫魔法方法
- __init__(self)//初始化对象不用对象调用,默认函数,创建对象自动调用
- 带参数的__init__(self,pramrm1,pramrm2)
对象名 = 类名(默认函数参数) - __str__()//打印对象不再输出对象的内存地址,而是输出__str__方法的return返回值//return一般是类或者对象的说明//return相当于print
- __del__()//删除对象时自动调用
- 烤地瓜
需求:属性:烤的时间,地瓜状态,添加调料
方法:烤的时间 ,添加调料 - 搬家具:将小于房子剩余面积的家具摆放到房子
五、继承
继承的概念
单继承
多继承
子类重写父类的同名属性和方法
子类调用父类的同名属性和方法
多层继承
super()
私有属性和私有方法
-
解释器版本不同有两种类的定义
python2经典类
class 类名:
代码
、、、
python3新式类
class 类名(object): //object为继承的类
代码
、、、 -
Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类
-
子类可以继承父类的方法
-
单继承//一个类继承另外一个类的所有属性和方法
煎饼果子继承实例 -
多继承//一个类继承多个类
class 类名(继承类1,继承类2):
pass
当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法 -
子类重写父类的同名属性和方法
如果子类和父类有同名属性和方法,在创建子类对象的时候调用的是子类的方法和属性 -
print(类名.__mro__)//查看继承关系
-
子类调用父类的同名属性和方法
在子类里定义函数,函数中使用父类.方法(self)来调用父类中的方法和属性,使用父类调用初始化魔法方法
如果是先调用了父类的属性和方法,父类属性会覆盖子类属性,故在调用属性前,先调用自己子类的初始化
调用父类方法,但是为保证调用到的也是父类的属性,必须在调用方法前调用父类的初始化
括号里都要写self//接受将来传入的对象 -
多层继承
子类可以继承父类的父类 -
super()调用父类方法
super(当前类名,self).函数()
super().函数()
super()可以自动查找父类,调用遵循_mro_类属性的顺序,比较适合单继承使用.//多继承会怎么样?? -
私有权限//不将属性和方法传给子类,子类不可调用
设置私有权限的方法:在属性名和方法名前面加上两个下划线 -
获取和修改私有属性值//利用子类对象.父类函数来获取修改
在Python中,一般定义函数名get_xx用来获取私有属性,定义set_xx用来修改私有属性 -
面向对象三大特性
封装:
将属性和方法写到类里面的操作即为封装
封装可以为属性和方法添加私有权限
继承:
子类默认继承父类的所有属性和方法
子类可以重写父类属性和方法
多态:
传入不同的对象,产生不同的结果
13.1 多态是一种使用对象的一种方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行结果
警务人员和警犬一起追击敌人和毒品
Step1:定义父类。提供公共方法 Step2:定义子类,子类重写父类方法
Step3:创建对象,调用不同的功能,传入不同的对象,观察执行的结果
类属性和实例属性 -
类属性就是类对象所拥有的属性,他是该类的所有实例对象所共有
-
类属性可以使用类对象(类名.属性)或实例对象(对象名.属性)访问
-
记录的某项数据始终保持一致,则定义类属性,更节省内存空间。
-
类属性只能通过类对象修改,不能通过实例对象修改,实例对象修改是创建一个和类属性同名的实例属性。 类属性和实例属性的区别???
类方法和静态方法
1.类方法:需要用装饰器@classmethod来标识类方法,第一个参数必须为类对象,一般以cls作为第一个参数
2.访问私有属性时,定义类方法
3.类方法一般和类属性配合使用
4.@classmethod
def 函数名(cls):
代码
、、、
5.静态方法需要通过装饰器@staticmethod来修饰 ,静态方法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)
6.静态方法也能够通过实例对象和类对象去访问
7.方法中既不需要使用实例对象,也不需要使用类对象时,定义静态方法
8.取消不需要的参数传递,有利于减少不必要的内存占用和性能消耗