继承super

 面向对象少不了继承。

继承:表示子类可以使用其父类中方法。

在Python中,可以通过super() 函数来调用父类的方法。

简单继承

class Person():
    def speak(self):
        print('i can speak')

    def sing(self):
        print('i can sing')

    def rap(self):
        print('i can rap')

    def basketball(self):
        print('i can basketball')
Student (学生类)也有同样的方法,如果再重新写一遍这四个函数就比较麻烦。因此这个时候就可以用到继承。学生类来继承Person类(也就是说Student是Person的子类,Person是Student的父类)
# Student(Object) 括号中的类,表示要继承的类
class Student(Person):
    pass

# Student1(Object) 括号中的类,表示要继承的类
class Student1(Person):
    def study(self):
        print('i like study')

if __name__ == '__main__':
    # 实例化一个Student对象
    s = Student()
    s.rap()  #  i can rap
    s.basketball() # i can basketball

    s1 = Student1()
    s1.rap()  # i can rap
    s1.study() # i like study

  Student1可以再定义一个study函数。

 super继承

在子类中如果需要去掉用父类的方法时,可以通过 super(). 父类方法 的形式完成。

class A:
    def get_name(self):
        return 'my name is xiaoming'

class B(A):
    def my_info(self):
        print('i am 18 years old')
        # 通过super() 函数 调用父类A 中的get_name函数,返回字符串
        print(super().get_name())
        print('i like rap and basketball')

if __name__ == '__main__':
    b = B()
    """
    输出:
    i am 18 years old
    my name is xiaoming
    i like rap and basketball
    """
    b.my_info()

  在B方法中调用my_info 时,可以直接通过父类A中的get_name 方法 获取到名字。

如果一个子类继承了两个父类,并且父类中的方法名相同。那究竟会调用哪个类呢?

   这个问题可以通过类的内置属性 __mro__ 去查看调用顺序。这个方法主要是在多继承时判断方法、属性的调用路径。

class A:
    num = 1
    def method(self):
        print('A ..method')

class B:
    num = 2
    def method(self):
        print('B .. method')


class C(A, B):
    num = 3
    pass

if __name__ == '__main__':
    c = C()
    print(C.__mro__)  # (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
    print(c.num)  #  3
    c.method()  # A ..method

  C.__mro__ 打印结果可以执行顺序为 C -> A - >B

  因此print(c.num)。因为c中有num属性,所以会打印3.

  执行c.method时 。因为c中没有method属性,会去A中查找,则输出 A..method。

 

posted @ 2019-08-26 12:43  JamJarBranch  阅读(76)  评论(0)    收藏  举报