一、继承
什么是继承?
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类
继承是一种关系,描述两个对象之间,什么是什么的关系
python中的类的继承分为:单继承和多继承
class ParentClass1: # 定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类 pass
查看继承
SubClass1.__bases__ #(<class '__main__.ParentClass1'>,) #__base__只查看从左到右继承的第一个子类,__bases__ 则是查看所有继承的父类 如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,他提供了一些常见方法(如__str__)的实现。 ParentClass1.__bases__ (<class 'object'>,)
抽象:
不具体,不清晰,很模糊,看不懂
将多个子类中相同的部分,进行抽取,形成一个新的类,这个过程也称为抽象的过程
正确的使用继承:
1.先抽象在继承
2.继承一个已经现存的类,扩展或是修改原始的功能
属性的查找顺序
对象自己的 ---》所在类中 ---》找父类 ---》 父类的父类 ---》object
class Animal: def __init__(self,name,aggr,life_value): self.name = name self.aggr = aggr self.life_value = life_value def eat(self): print('%s is eating'%self.name) class Dog(Animal): pass class Person(Animal): pass per = Person('yy',10,100) dog = Dog('uu',20,1000) per.eat() dog.eat()
派生
当一个子类中出现了与父类中不同的内容时,这个子类就称之为派生类,通常子类都会写一些新的代码,不可能和父类完全一样,即通常都是派生类,所以派生类值得就是子类。
class Animal: ''' 人和狗都是动物,所以创造一个Animal基类 ''' def __init__(self, name, aggressivity, life_value): self.name = name # 人和狗都有自己的昵称; self.aggressivity = aggressivity # 人和狗都有自己的攻击力; self.life_value = life_value # 人和狗都有自己的生命值; def eat(self): print('%s is eating'%self.name) class Dog(Animal): ''' 狗类,继承Animal类 ''' def bite(self, people): ''' 派生:狗有咬人的技能 :param people: ''' people.life_value -= self.aggressivity class Person(Animal): ''' 人类,继承Animal ''' def attack(self, dog): ''' 派生:人有攻击的技能 :param dog: ''' dog.life_value -= self.aggressivity egg = Person('egon',10,1000) ha2 = Dog('二愣子',50,1000) print(ha2.life_value) print(egg.attack(ha2)) print(ha2.life_value)
覆盖:
在子类中,新建的重名的函数属性,在编辑函数内功能的时候,有可能需要重用的那个函数功能,应该是用调用普通函数的方式,即:类名.func(),此时就与调用普通函数无异了,因此即便是self参数也要为其传值。
在python3中,子类执行父类的方法也可以直接用super方法
class A: def hahaha(self): print('A') class B(A): def hahaha(self): super().hahaha() print('B')
通过继承建立了派生类与基类之间的关系,它是一种‘是’的关系,比如白马是马,人是动物。
当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好
class Teacher: ... def __init__(self,name,gender): ... self.name=name ... self.gender=gender ... def teach(self): ... print('teaching') ... >>> >>> class Professor(Teacher): ... pass ... >>> p1=Professor('egon','male') >>> p1.teach() teaching
组合
也是一种关系,描述两个对象之间,是什么有什么的关系
例如,学生有手机,游戏中角色拥有某些装备
将一个对象作为另一个对象的属性
组合的目的:
也是为了重用现有代码
什么时候使用继承:分析两个类的关系,到底是不是:什么是什么的关系
什么时候使用组合:如果两个类之间,没有太大的关系,完全不属于同类
另外组合相比继承,耦合度更低了
菱形继承
新式类与经典类
python3中任何类都是直接或间接继承了object
新式类,任何显式或隐式地继承自object的类就称之为新式类,python3中都是新式类
经典类,既不是object的子类,仅在python2中出现
当出现菱形继承时,新式类,先深度,当遇到了共同父类时就广度
经典类就是深度优先