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

  • 相关阅读:
    Nginx配置中一个不起眼字符"/"的巨大作用
    Logstash:多个配置文件(conf)
    2019年末Powershell 挖矿病毒的处理与防范
    2021年复习内容包括
    WPF 中双向绑定通知机制之ObservableCollection
    VB里Property用于标识一个类成员为属性而不是方法。
    KubeOperator
    页面布局-Grid,StackPanel,DockPanel,WrapPanel
    HTML-框架目录
    分析一段XAML语言代码
  • 原文地址:https://www.cnblogs.com/Agoni-7/p/11160374.html
Copyright © 2011-2022 走看看