Python学习笔记(二十三)
多继承
概念
子类可以拥有多个父类,并且具有所有父类的属性和方法
例如:孩子会继承自己父亲和母亲的特性
语法:
class 子类名(父类名1, 父类名2):
pass
多继承的使用注意事项
问题的提出
如果不退的父类中存在同名的方法,子类对象在调用方法时,会调用哪一个父类中的方法呢?
提示:开发时,应该尽量避免这种容易产生混淆的情况! -- 如果父类之间存在同名的属性或者方法,
应该尽量避免使用多继承
Python中的MRO--方法搜索顺序(知道)
Python中针对类提供了一个内置属性__mro__可以查看方法搜索顺序
MRO是method resolution order,主要用于在多继承时判断方法、属性的调用路径
在搜索方法时,是按照__mro__的输出结果从左至右的顺序查找的
如果在当前类中找到方法,就直接执行,不再搜索
如果没有找到,就查找下一个类中是否有对应的方法,如果找到,就直接执行,不再搜索
如果找到最后一个类,还没有找到方法,程序报错
新式类与旧式(经典)类
object是python为所有对象提供的基类,提供有一些内置的属性和方法,可以使用dir函数查看
新式类:以object为基类的类,推荐使用
经典类:不以object为基类的类,不推荐使用
在python3.X中定义类时,如果没有指定父类,会默认使用object作为该类的基类--Python3.X中定义的类都是新式类
在Python2.X中定义类时,如果没有指定父类,则不会以Object作为基类
新式类和经典类在多继承时 - - 会影响到方法的搜索顺序
为了保证编写的代码能够同时在python 2.X和python 3.X 运行!
今后在定义类时,如果没有父类,建议统一继承自object
class 类名(object):
pass
多态
面对对象的三大特性
1、封装根据职责将属性和方法封装到一个抽象的类中
定义类的准则
2、继承实现代码的重用,相同的代码不需要重复的编写
设计类的技巧
子类针对自己特有的需求,编写特定的代码
3、多态不同的子类对象调用相同的父类方法,产生不同的执行结果
多态可以增加代码的灵活度
以继承和重写父类方法为前提
是调用方法的技巧,不会影响到类的内部设计
class Dog(object): def __init__(self, name): self.name = name def game(self): print("%s 只是简单的玩耍" % self.name) class XiaoTianDog(Dog): def game(self): print("%s 飞到天上玩耍" % self.name) class Person(object): def __init__(self, name): self.name = name def game_with_dog(self, dog): print("%s 和 %s 快乐的玩耍" % (self.name, dog.name)) dog.game() wangcai = Dog("旺财") xiaoming = Person("小明") xiaoming.game_with_dog(wangcai) xtq = XiaoTianDog("哮天犬") erlangshen = Person("二郎神") erlangshen.game_with_dog(xtq)
类的结构
1、术语 -- 实例
1、使用面向对象开发,第一步是设计类
2、使用类名()创建对象,创建对象的动作有两步:
1、在内存中为对象分配空间
2、调用初始化方法__init__为对象初始化
3、对象创建后,内存中就有了一个对象的实实在在的存在 -- 实例
因此 通常也会把
1、创建出来的对象叫做类的实例
2、创建对象的动作叫做实例
3、对象的属性叫做实例属性
4、对象调用的方法叫做实例方法
在程序执行时:
1、对象各自拥有自己的实例属性
2、调用对象方法,可以通过self
访问自己的属性
调用自己的方法
结论
每一个对象都有自己的独立的内存空间,保存各自不同的属性
多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部
类是一个特殊的对象
Python中一切皆对象
class AAA:定义的类属于类对象
obj1 = AAA() 属于实例对象
在程序运行时,类同样会被加载到内存
在python中,类是一个特殊的对象 -- 类对象
在程序运行时,类对象在内存中只有一份,使用一个类可以创建出很多个对象实例
除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法
1、类属性
2、类方法
通过类名的方式可以访问类的属性或者调用类的方法
类属性和实例属性
概念和适用
类属性就是给类对象中定义的属性
通常用来记录与整个类相关的特征
类属性不会用于记录具体对象的特征
实例需求
定义一个工具类
每件工具都有自己的name
需求 - - 知道适用整个类,创建了多少个工具对象
2、属性的获取机制(科普)
在Python中属性的获取存在一个向上查找机制
因此,要访问类属性有两种方式
1、类名.类属性
2、对象.类属性(不推荐)
注意
如果使用对象.类属性 = 值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值