一、继承
一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;被继承的类称为父类或者超类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
- 1. 继承语法
- 调用父类方法的函数写法有三种
class A(): def __init__(self,*args): '--snip--此处省写属性赋值' pass '''第一种''' '''前提是只有在python 3.x版本下才可以使用''' '''super().父类方法()''' '''--------推荐使用这种方法---------''' class B(A): def __init__(self,*args): super().__init__(*args) '''第二种''' '''python 2.x和python 3.x中都可以使用''' '''super(子类名称,self).父类方法()''' class B(A): def __init__(self,*args): super(B,self).__init__(*args) '''第三种''' '''python 2.x和python 3.x中都可以使用''' '''父类名称.父类方法()''' class B(A): def __init__(self,*args): A.__init__(self,*args)
- 方法的优缺点
显然,第一种方法优于第二种。
第三种方法缺点是:在父类名改变的情况下,需要自己手动到一个个子类中去改变父类名。且在多继承的时候,需要对继承的父类进行分别调用(比如继承父类A和B,那么需要在子类中 A.__init__(self,*args) B.__init__(self,*args),这样的话工作量较大。
二、继承中__init__()方法
__init__方法的作用是初始化类中的属性。当你创建实例的时候,类中的__init__方法会自动执行。不需要你显式的调用。
注意:__init__()方法中第一个形参必须是 self。 形参self做作用很大。每个与类相关联的方法
调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
与继承方法__init__()相关的三个问题
- 2.1 子类没有定义自己的初始化函数,父类的初始化函数会被默认调用。
class parent(): def __init__(self,race,country): self.race = race self.country = country def information(self): print('我来自{},是{}人'.format(self.country,self.race)) def test(self): print('父类的方法') class son(parent): pass '''tip1:此时需要注意,当子类实例化时,由于子类没有初始化,此时父类的初始化函数就会默认被调用,且必须传入父类的参数。 如果不传入父类的参数就会报错'''
- 2.2 子类定义了自己的初始化函数,而在子类中没有显式调用父类的初始化函数,则父类的属性不会被初始化
class parent(): def __init__(self,race,country): self.race = race self.country = country def information(self): print('我来自{},是{}人'.format(self.country,self.race)) def test(self): print('父类的方法') class son(parent): def __init__(self): pass '''tip1:此时用子类创建实例的时候,就按照子类的初始化函数传入实参。如果还按照父类的就会报错''' '''tip2: 父类的属性没有被初始化,无法通过子类创建的实例来直接访问父类中的属性''' '''tip3: 此时还是可以访问父类中的方法的'''
tip1实例
tip2 实例
tip3实例
- 2.3 如果子类定义了自己的初始化函数,显式调用父类,子类和父类的属性都会被初始化
class parent(): def __init__(self,race,country): self.race = race self.country = country def information(self): print('我来自{},是{}人'.format(self.country,self.race)) def test(self): print('父类的方法') class son(parent): def __init__(self,race,country): super().__init__(race,country) pass '''tip1:此时子类中初始化函数中参数必须包括父类中的参数,也就是父类初始化函数的形参是子类初始化函数中形参的子集,否则会报错''' '''即super().__init__(*arg1)中的*arg1 必须是 __init__(self,*args2) 的*args2的子集''' ''' *arg1 ∈ *args2 '''
tip1:实例
三种情况的总结 :
1、子类中若有__init__()方法,则创建实例时传入的参数,须与__init__()方法中形参数量一致(self不算在内)
2、这三种情况,父类中的方法都是可以调用的
3、使用子类创建实例的时候,父类的初始化方法必须被子类显式调用才会执行。而子类的初始化方法会自动执行