Python入门学习 DAY24(继承)

Python入门学习

DAY24

今日内容:  继承

继承

1.什么是继承

        继承就是新建类的一种方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类

        python中继承的特点:

                ①子类可以继承/重用父类的属性

                ②一个子类可以同时继承多个父类

                ③在继承的背景下,python中的类又可以分为:经典类 新式类

                           新式类:即继承了object的类,以及该类的子类等等,都为新式类

                                       在python3中一个类即是没有显示的继承任何类,默认就会继承object,

                                       所以在python3都是新式类,没有经典类

                           经典类:没有继承object的类,以及该类的子类等等,都为经典类

                                       在python2中才区分新式类与经典类,
                                       在python2中一个类如果没有显式地继承任何类,也不会继承object

2.为什么要使用继承

      为了减少类与类之间的代码冗余     

3.如何用继承

如何减少代码冗余 

      列:有如下两个类,我们可以发现2个类又很多相似的代码,造成了代码冗余,因此我们可以定义一个父类解决这个问题

class Student():
    def __init__(self, name, age, sex, score=0):
         self.name = name
         self.age = age
         self.sex = sex
         self.score = score

    def choose_course(self):
        print('%s choosing course' % self.name)

class Teacher():
    def __init__(self,name,age,sex,level):
         self.name=name
         self.age=age
         self.sex=sex
         self.level=level

    def score(self,stu,num):
        stu.score=num

解决方案:

class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex


class Student(People):
    def choose_course(self):
        print('%s choosing course' % self.name)

class Teacher(People):
    def score(self,stu,num):
        stu.score=num

但是我们发现每一个类又有自己不同的属性要加,student 要加入score属性,teacher 要加入level属性

因此我们需要重用父类的属性,有两个方法

在子类派生出的新方法中重用父类功能的方式一:指名道姓地引用某一个类中的函数

列:其中使用代码People.__init__(self,name,age,sex) 

class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

class Student(People):
    def __init__(self, name, age, sex, score=0):
        People.__init__(self,name,age,sex)
        self.score = score

    def choose_course(self):
        print('%s choosing course' % self.name)

class Teacher(People):
    def __init__(self,name,age,sex,level):
        People.__init__(self,name,age,sex)
        self.level=level

    def score(self,stu,num):
        stu.score=num

方式一总结:
1. 与继承无关(因为相对于只是调用了类的一个功能)

2. 访问是类的函数,没有自动传值的效果

在子类派生出的新方法中重用父类功能的方式二:super()必须在类中用

在python2中:super(自己的类名,自己的对象)
在python3中:super()

python专门为新式类内置了一个mro的方法,用来查看方法解析顺序
调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性,注意:完全参照mro列表

列:使用super()内置方法解决该问题

class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

class Student(People):
    def __init__(self, name, age, sex, score=0):
        super().__init__(name,age,sex)
        self.score = score

    def choose_course(self):
        print('%s choosing course' % self.name)

class Teacher(People):
    def __init__(self,name,age,sex,level):
        super().__init__(name,age,sex)
        self.level=level

    def score(self,stu,num):
        stu.score=num
    


方式二总结:
1. 严格依赖继承的mro列表

2. 访问是绑定方法,有自动传值的效果

以上为本次学习内容

猜你喜欢

转载自blog.csdn.net/sql121407/article/details/81876615