zoukankan      html  css  js  c++  java
  • Python -- 继承关系

    什么是继承?

    • 专业角度:B类继承A类,B类就叫做A的子类/派生类,A就叫做B类的父类/超类
    • B类以及B类的对象可以使用A 类的所有的属性以及方法

    继承的优点:

    • 节省代码
    • 增强耦合性
    • 使代码更加规范化

    通过一个例子看一下继承:

    class Person:
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
            
    class Cat:
        def __init__(self,name,sex,age):
            self.name = name
            self.age = age
            self.sex = sex
    
    class Dog:
        def __init__(self,name,sex,age):
            self.name = name
            self.age = age
            self.sex = sex
            
    # 继承的用法
    class Animal:
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
            
    class Person(Animal):
        psss
    
    class Dog(Animal):
        pass
    
    class Cat(Animal):
        pass
    

    单继承

    • 从类名执行父类的属性

    • 从对象执行父类的属一切(实例化对象一定会发生三件事,一定会执行__init__)

      注意:子类以及子类对象只能调用父类的属性以及方法,不能操作(增删改)

    class Animal:
    
        live = '有生命'
    
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def eat(self):
            print(self)     # 哪个对象执行方法就将这个对象的地址传给方法中的self
            print('都要吃饭')
    
    class Dog(Animal):
        pass
    
    d = Dog('黑豆',6,'ladboy')
    print(d.__dict__)
    print(d.live)
    d.eat()
    
    #如何既要执行父类方法又要执子类方法
    
    class Animal:
    
        live = '有生命'
    
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def eat(self):
            # print(self)
            print('都要吃饭')
    
    class Dog(Animal):
    
        def __init__(self,name,age,sex,hobby):
            # Animal.__init__(self,name,age,sex)      # 方法一
            # super(Dog,self).__init__(name,age,sex)  # 方法二
            super().__init__(name,age,sex)            # 方法二简写
            self.hobby = hobby
    
        def eat(self):
            super().eat()
            print('吃饭啦')
    
    d = Dog('黑豆',6,'ladboy','抢球')
    print(d.__dict__)
    d.eat()
    
    # 执行顺序: 实例化对象必须执行__init__方法,子类中没有,从父类中找,父类没有,从object中找
    # 先要执行自己类中的eat方法,自己类没有才能执行父类的方法
    
    # 单继承练习题
    
    
    class Base:
        def __init__(self, num):
            self.num = num   # num = 123
        def func1(self):
            print(self.num)  
    
    class Foo(Base):
        pass
    obj = Foo(123)
    obj.func1() # 123 运⾏的是Base中的func1  
    
        
    class Base:
        def __init__(self, num):
            self.num = num   # num = 123
        def func1(self):
            print(self.num)
    class Foo(Base):
        def func1(self):
            print("Foo. func1", self.num)
    obj = Foo(123)
    obj.func1() # Foo. func1 123 运⾏的是Foo中的func1       
    
    
    class Base:
        def __init__(self, num):
            self.num = num
        def func1(self):
            print(self.num)
            self.func2()
        def func2(self):
            print("Base.func2")
    class Foo(Base):
        def func2(self):
        	print("Foo.func2")
    obj = Foo(123)
    obj.func1() # 123 Foo.func2 func1是Base中的 func2是⼦类中的 
    
    
    class Base:
        def __init__(self, num):
            self.num = num
        def func1(self):
            print(self.num)
            self.func2()
        def func2(self):
            print(111, self.num)
    class Foo(Base):
        def func2(self):
            print(222, self.num)
    lst = [Base(1), Base(2), Foo(3)]
    for obj in lst:
        obj.func2() # 111 1 | 111 2 | 222 3
    
    
    class Base:
        def __init__(self, num):
            self.num = num
        def func1(self):
            print(self.num)
            self.func2()
        def func2(self):
            print(111, self.num)
    class Foo(Base):
        def func2(self):
            print(222, self.num)
    lst = [Base(1), Base(2), Foo(3)]
    for obj in lst:
     obj.func1() 
    

    多继承

    class ShenXian: # 神仙
        def fei(self):
            print("神仙都会⻜")
    class Monkey: # 猴
        def chitao(self):
            print("猴⼦喜欢吃桃⼦")
    class SunWukong(ShenXian, Monkey): # 孙悟空是神仙, 同时也是⼀只猴
        pass
    sxz = SunWukong() # 孙悟空
    sxz.chitao() # 会吃桃⼦
    sxz.fei() # 会⻜
    

    Python中类的种类(继承需要):

    • 在Python2.2之前都是经典类

    • Python2.2--2.7之间存在两种类型,经典类和新式类.

      经典类:基类不继承object 查询规则:依靠深度优先的原则(从左到右,每次走到头)

      新式类:基类必须继承object 查询规则:mro算法

    Python3X 只有新式类. 如果基类谁都不继承. 那这个类会默认继承 object

  • 相关阅读:
    数据类型装换
    变量及数据类型
    27 网络通信协议 udp tcp
    26 socket简单操作
    26 socket简单操作
    14 内置函数 递归 二分法查找
    15 装饰器 开闭原则 代参装饰器 多个装饰器同一函数应用
    12 生成器和生成器函数以及各种推导式
    13 内置函数 匿名函数 eval,exec,compile
    10 函数进阶 动态传参 作用域和名称空间 函数的嵌套 全局变量
  • 原文地址:https://www.cnblogs.com/Agoni-7/p/11160374.html
Copyright © 2011-2022 走看看