-----------------------------------------------------------------------------------------------------------------------------------------------
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。
派生类/子类 ----------->基类/父类
继承是指这样一种能力:
1、功能扩展:实现类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
2、方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
3、构造函数__init__:a、子类中需要父类的构造方法就需要显示的调用父类的构造方法,或者不重写父类的构造方法
b、子类完全重构父类的构造方法__init__
c、子类部分重构父类的构造函数__init__
-----------------------------------------------------------------------------------------------------------------------------------------------
第一:功能扩展
子类,继承父类全部,并添加其特有的方法
class animal(object):
def __init__(self,animal,animal_taxonomy):
self.animal=animal
self.animal_taxonomy=animal_taxonomy
def animal_class(self):
print('earth animal %s'%self.animal)
class dog(animal):
def dog_class(self,dog_name):
print('dog name %s'%dog_name)
aktia=dog('diqiu','dongwu')
aktia.animal_class()
aktia.dog_class('wangcai')
打印结果:earth animal diqiu
dog name wangcai
第二:方法重写
重写父类方法,注意点:因为完成继承父类的构造函数__init__,所以在重写子类的方法,可以直接self.animal,传入对应的参数【相当于省略了一部分代码,即子省略的__init__构造函数的代码】
class animals(object):
def __init__(self,animal,animal_taxonomy):
self.animal=animal
self.animal_taxonomy=animal_taxonomy
def animal_class(self):
print('earth animal %s'%self.animal)
class cat(animals):
def animal_class(self,country):
print('earth animal %s county %s'%(self.animal,country))#直接传入self.animal
xiaohuang=cat('diqiu','dongwu')
xiaohuang.animal_class('china')
第三:构造函数__init__
1、不重写父类的构造方法,就是子类的构造函数__init__完全和父类一致【因为一致,所以没有写,代码简洁】
eg:第一/第二条目录
2、完成重构父类的构造函数__init__【即子类重写构造函数,且没有显示调用父类的构造函数】
【这样我们甚至可以直接新定义一个类,而非继承】
class animals(object):
def __init__(self,animal,animal_taxonomy):
self.animal=animal
self.animal_taxonomy=animal_taxonomy
def animal_class(self):
print('earth animal %s'%self.animal)
class insect(animals):
def __init__(self,star,purpose):
self.star=star
self.purpose=purpose
print(self.star)
def insect_class(self):
print('star animal %s'%self.star)
注意:完全重构__init__构造函数。父类中的__init__不会调用,即不会传入对应的参数,导致,我们即使调用父类方法【没有重写】,如果该父类方法引用父类__init__中的参数,那么报错。
3、部分重构父类的构造函数__init__【在子类中显示调用父类,子类和父类的属性都会被初始化】
目的:
- 初始化时添加部分参数;
- 如果显示调用父类的__init__传入的参数,少于父类中的原始参数,那么只初始化了传入的参数。当然如果父类的__init__调用类变量,则不受影响。
显示调用父类构造函数方法有二:
- 1.经典类的写法: 父类名称.__init__(self,参数1,参数2,...)
- 2. 新式类的写法:super(子类,self).__init__(参数1,参数2,....)
class animals(object):
def __init__(self,animal,animal_taxonomy):
self.animal=animal
self.animal_taxonomy=animal_taxonomy
def animal_class(self):
print('earth animal %s'%self.animal)
class whale(animals):
def __init__(self,animal,animal_taxonomy,weight):
self.weight=weight
#super(whale,self).__init__(animal,animal_taxonomy)
animals.__init__(self,animal,animal_taxonomy)
def animal_weight(self):
print('animal wight %s'%self.weight)
ww=whale('diqiu','dongwu','very big')
ww.animal_weight()
ww.animal_class()