Python之继承(概念,单继承,多继承)

概念

  • 如果两个或者两个以上的类具有相同的特征【属性】和行为【成员函数】,我们可以抽取一个类出来,在抽取出来的类中声明公共的部分
  • 被抽取出来的类:父类,超类,基类
  • 两个或者两个以上的类:子类,派生类
  • 他们之间的关系:子类继承自父类       父类派生出子类
  • 作用:简化代码,提高了代码的复用性和可维护性

单继承

  • 一个子类只能有一个父类,被称为单继承
  • 语法: 

父类:

class 父类类名(object):

类体【公共部分】

子类:

class 子类类名(父类类名):

类体【子类特有的部分】

  • 注意:object是所有类的父类
#定义父类
#注意:如果没有显示的规定父类,则这个类的父类默认为object
class Person(object):
    #成员变量
    def __init__(self,name,age):
        self.name = name
        self.age = age
    
    #成员函数
    def show(self):
        print("父类中的show被调用")

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self,age):
        self.__age = age

#定义子类
class Worker(Person):
    def __init__(self,name,age):
        #在子类中调用父类中的构造函数,主要是为了将父类中的现有的成员变量应用到子类中,即父类的引用
        #1.super(当前类,self).__init__(属性列表)
        super(Worker,self).__init__(name,age)
        #2.父类名.__init__(self,属性列表)
        #Person.__init__(self,name,age)
        #3.super().__init__(属性列表)
        #super().__init__(name,age)
    #说明:上面三种写法都可以使用,目的是调用父类的构造函数

#定义子类
class Student(Person):
    def __init__(self,name,age,subject):
        super().__init__(name,age)
    def test(self):
        print("testing")


#1.创建父类对象
p = Person("LiSi",10)
print(p.name,p.age)          #LiSi 10
p.show()           #父类中的show被调用

#2.创建子类的对象
w1 = Worker("aaa",1)
print(w1.name,w1.age)        #aaa 1 
w1.show()         #父类中的show被调用

#3.子类除了继承父类中的成员变量和成员函数之外,还可以有特有的成员变量和成员函数
s = Student("bob",18,"语文")
s.show()         #父类中的show被调用
s.test()        #testing

#4.子类对象可以访问父类中的公共的成员变量和成员函数,反之,父类对象无法访问子类中特有的成员变量和成员函数
p.test()    #AttributeError: 'Person' object has no attribute 'test'

总结:

  • 继承的特点:
  1. 子类对象可以直接访问父类中未私有化的属性
  2. 子类对象可以调用父类中为私有化的成员函数
  3. 父类对象不能访问子类特有的属性和成员函数
  • 继承的优缺点:
  1. 优点:可以简化代码,减少冗余;可提高代码的可维护性;提高代码的安全性;是多态的前提
  2. 缺点:在继承关系中,耦合性是比较高的【如果修改父类,子类也随之发生改变】

解释:耦合性和内聚性被用来描述类与类之间的关系,耦合性越低,内聚性越高,说明代码越好

多继承 

  • 一个子类可以有多个父类,称为多继承
  • 注意:不能为了使用某个类中的某些功能,而刻意去实现继承
    class Father1(object):
        def __init__(self,money):
            self.money = money
        def play(self):
            print("play")
        def func(self):
            print("func----1111")
    
    class Father2(object):
        def __init__(self,faceValue):
            self.faceValue = faceValue
        def eat(self):
            print("eat")
        def func(self):
            print("func----2222")
    
    class Child(Father1,Father2):
        def __init__(self,money,faceValue,hobby):
            self.hobby = hobby
    
            #注意:子类继承多个父类中的成员变量,需要分别调用父类中构造函数
            Father1.__init__(self,money)
            Father2.__init__(self,faceValue)
    
        def show(self):
            print("show")
    
            
    #创建一个子类对象
    c = Child(100,100,"打麻将")
    print(c.money,c.faceValue,c.hobby)      #100 100 打麻将
    c.play()             #play
    c.eat()           #eat
    c.show()           #show
    c.func()         #func----1111
    #注意:如果多个父类中存在重名的函数,当子类对象调用的时候,Python在父类列表中从左到右进行搜索

     

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值