Python面向对象编程之(继承一)

一、继承

一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;被继承的类称为父类或者超类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

  1. 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、使用子类创建实例的时候,父类的初始化方法必须被子类显式调用才会执行。而子类的初始化方法会自动执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值