python(类继承)

一、继承
1.单继承
  • 一个对象使用另一个对象的属性和方法,被继承的类也称父类

(1)父类与子类的方法不一样

class Four():
    def sub(self,x,y):
        return x + y

class Five(Four):       #Five类继承了Four类 --> Five 类拥有了 Four 类下的所有函数方法
    def reduce(self,a,b):
        return a - b

print (Five().sub(2,5))

#结果如下
7

(2)子类拥有与父类相同的方法

  • 当子类拥有与父类相同的方法,通过子类实例调用该方法后,执行的是子类下的方法
class Mother():
    def name(self):
        print("This is my mother!")

class MySelf(Mother):
    #对父类方法重写
    def name(self):
        print("My name is XiaoMing")

M = MySelf()
M.name()

#结果如下
My name is XiaoMing

(3)子类拥有与父类相同的方法和属性

class Teacher():
    #在父类中定义属性
    def __init__(self,name):
        self.name = name
    def Name(self):
        print("My teacher name is {} !".format(self.name))

class MySelf(Teacher):
    #对父类方法重写
    def Name(self):
        print("My name is {} !".format(self.name))

M = MySelf("XiaoWang")
M.Name()

#结果如下
My name is XiaoWang !
"""
在子类中使用了 super() 函数调用父类方法(常用于多继承)
"""
class Teacher():
    #在父类中定义属性
    def __init__(self,name):
        self.name = name
    def Name(self):
        print("My teacher name is {} !".format(self.name))

class MySelf(Teacher):
    def __init__(self,course,name):
        super(MySelf, self).__init__(name)
        self.course = course
    #对父类方法重写
    def Name(self):
        print("My name is {} !".format(self.name))
    def Course(self):
        print("我的{}课老师的名字是{}".format(self.course,self.name))

M = MySelf("数学","Bob")
M.Name()
M.Course()

#结果如下
My name is Bob !
我的数学课老师的名字是Bob

2.多继承

  • 多重继承就是一个子类继承多个父类
class Mother():
    def hobby(self):
        print("Mother love shopping!")

class Father():
    def work(self):
        print("Father work is Test Engineer")

class Myself(Father,Mother):
    pass

M = Myself()
M.work()
M.hobby()

#结果如下
Father work is Test Engineer
Mother love shopping!
class Mother():
    def __init__(self,something):
        self.something = something

    def Hobby(self):
        print("Mother love {}!".format(self.something))

class Father():
    def __init__(self,work):
        self.work = work

    def Work(self):
        print("Father work is {}".format(self.work))

class Myself(Father,Mother):
    def __init__(self,work,something):
        # 注意:对于多继承来说,使用 super() 只会调用第一个父类的属性方法
        # 要想调用特定父类的构造器只能使用 "父类名.__init__(self)" 方式。如下:
        Father.__init__(self, work)
        Mother.__init__(self,something)

M = Myself("test", "shopping")
M.Work()
M.Hobby()
#我们可以用mro来查看顺序
print(Myself.mro())

#结果如下
Father work is test
Mother love shopping!
[<class '__main__.Myself'>, <class '__main__.Father'>, <class '__main__.Mother'>, <class 'object'>]
  •  如果不同的两个父类出现了相同名称的属性或者方法,子类会继承谁的属性或者方法?
class Mother():
    def __init__(self,work):
        self.work = work
    def hobby(self):
        print("My mother work is {}.".format(self.work))

class Father():
    def __init__(self,work):
        self.work = work

    def hobby(self):
        print("My father work is {}.".format(self.work))

class Myself(Father,Mother):
    pass

M = Myself("Test")
M.hobby()

#结果如下
My father work is Test.
#由上面实例可知如下
1)python3中都是新式类:广度优先,从父类中查询对应的方法,查询到第一个满足的方法之后就直接返回
                object
                |
                A(object)
                |
    A_1(A) --> A_2(A)
    |
    Test(A_1, A_2)

(2)python2中的经典类:深度优先
            A
            |
    A  --> A_2(A)
    |
    A_1(A)
    |
    Test(A_1, A_2)
原文地址:https://www.cnblogs.com/ZhengYing0813/p/12422243.html