zoukankan      html  css  js  c++  java
  • 面向对象-继承

    一、什么是面向对象的继承?

    面向对象的三大特性:继承,封装,多态

    继承:

    • 字面意思:子承父业,合法继承家产,就是如果你是独生子,不出意外,你会继承你父母所有家产,他们所有财产都会由你使用。

    • 官方说法:如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。

    object类 新式类,类祖宗
    • 所有在 python3 当中的类都是继承object类的

    • object中有init

    • 所有的类都默认的继承object

    继承的优点:
    1. 增加了类的耦合性(耦合性不宜多,宜精)

    2. 减少了重复代码。

    3. 使得代码更加规范,合理化。

    继承的语法:
    class A:
        passclass B(A):
        pass# B继承A,A是父类,B是子类
    # A是父类 基类 超类
    # B是子类 派生类

    二、单继承

    单继承的语法:

    class A:
        pass
    class B(A):
        pass
    class C(B):
        pass
    class D(C):
        pass
    1.类名,对象执行父类方法,和执行顺序
    class Animal:
        creature = '动物'def __init__(self, name):
            self.name = name
    ​
        def eat(self):
            print(f'{self.name},可以吃')
    ​
        def drink(self):
            print(f'{self.name},可以喝')
    ​
        def sleep(self):
            print(f'{self.name},会睡觉')
    ​
    ​
    class Cat(Animal):
        def climb_tree(self):
            print(f'{self.name},会爬树')
    ​
    ​
    class Dog(Animal):
        def house_keep(self):
            print(f'{self.name},会看家')
    ​
    ​
    print(Cat.creature)         # 子类可以使用父类中的 : 方法 静态变量
    # 实例化对象必须执行__init__方法。类中没有,从父类找,父类没有,从object类中找
    Xiao_Bai = Cat('小白')       
    # 先开辟空间,空间里有一个类指针-->指向Cat
    # 调用init,对象在自己的空间中找init没找到,到Cat类中找init也没找到,
    # 找父类Animal中的init
    ​
    ​
    # 对象可以调用父类属性和方法
    Xiao_Bai.eat()              # --->小白,可以吃
    # 要执行自己类中的eat方法,自己类没有才能执行父类中的方法
    # 当子类和父类的方法重名的时候,我们只使用子类的方法,而不会去调用父类的方法了
    2.同时执行类以及父类方法
    • 例如:

      • 猫吃猫粮,hp 加100。

      • 狗吃狗粮,vigour 加100。

    方法一:

    子类想要调用父类的方法的同时还想执行自己的同名方法

    猫和狗在调用eat的时候既调用自己的也调用父类的,

    在子类的方法中调用父类的方法 :父类名.方法名(self)

    class Animal:
    ​
        def __init__(self, name, food):
            self.name = name
            self.food = food
            self.hp = 100
            self.vigour = 100def eat(self):
            print(f'{self.name},吃{self.food}')
    ​
        def drink(self):
            print(f'{self.name},可以喝')
    ​
        def sleep(self):
            print(f'{self.name},会睡觉')
    ​
    ​
    class Cat(Animal):
        def eat(self):
            self.hp += 100
            Animal.eat(self)        # 子类eat方法中调用父类eat方法
    def climb_tree(self):
            print(f'{self.name},会爬树')
    ​
    ​
    class Dog(Animal):
        def eat(self):
            self.vigour += 100
            Animal.eat(self)        # 子类eat方法中调用父类eat方法
    def house_keep(self):
            print(f'{self.name},会看家')
    ​
    ​
    Xiao_Bai = Cat('小白', '猫粮')
    Xiao_Hei = Dog('小黑', '狗粮')
    ​
    Xiao_Bai.eat()
    Xiao_Hei.eat()
    ​
    print(Xiao_Bai.__dict__)
    print(Xiao_Hei.__dict__)
    # 输出
    小白,吃猫粮
    小黑,吃狗粮
    {'name': '小白', 'food': '猫粮', 'hp': 200, 'vigour': 100}
    {'name': '小黑', 'food': '狗粮', 'hp': 100, 'vigour': 200}

    方法二:

    • 利用super,super( ). func ( 参数 )

    给狗和猫定制个性的属性

    • 猫:eye_color眼睛的颜色

    • 狗:size 狗的体型

    class Animal:
    ​
        def __init__(self, name):
            self.name = name
            self.hp = 100
            self.vigour = 100def eat(self):
            print(f'{self.name},吃{self.food}')
    ​
        def drink(self):
            print(f'{self.name},可以喝')
    ​
        def sleep(self):
            print(f'{self.name},会睡觉')
    ​
    ​
    class Cat(Animal):
        def __init__(self, name, eye_color):
            super().__init__(name)
            self.eye_color = eye_color
    ​
        def climb_tree(self):
            print(f'{self.name},会爬树')
    ​
    ​
    class Dog(Animal):
        def __init__(self, name, size):
            super().__init__(name)
            self.size = size
    ​
        def house_keep(self):
            print(f'{self.name},会看家')
    ​
    ​
    Xiao_Bai = Cat('小白', '蓝色')
    Xiao_Hei = Dog('小黑', '大型')
    ​
    print(Xiao_Bai.__dict__)
    print(Xiao_Hei.__dict__)
    ​
    # 输出
    {'name': '小白', 'hp': 100, 'vigour': 100, 'eye_color': '蓝色'}
    {'name': '小黑', 'hp': 100, 'vigour': 100, 'size': '大型'}

    三、多继承(初识,了解)

    • 单继承:

      • 只有一个爹

    • 多继承:

      • 有好几个爹

      • 有些语言不支持多继承 java

      • python语言的特点:可以在面向对象中支持多继承

    • 多继承语法:

    class A:
        pass
    class B:
        pass
    class C(A,B):   # 如果调用父类的变量和方法,会优先去找A类的,其次在去找B类的
        pass

    单继承:

    • 调子类的:子类自己有的时候

    • 调父类的:子类自己没有的时候

    • 调子类和父类的:子类父类都有,子类中调用父类的

    多继承:

    • 一个类有多少父类,在调用父类方法的时候,按照继承顺序,先继承的就先寻找。

    四、拾遗

    绑定方法和普通的函数
    from types import FunctionType, MethodType
    # FunctionType : 函数
    # MethodType : 方法
    • 类调用自身的函数就是——>函数

    • 对象调用类的函数是——>方法

    class A:
        def func(self):
            print('in func')
    ​
    ​
    print(A.func)  # 类调用自身的函数就是-->函数
    print(isinstance(A.func, FunctionType))     # 函数
    print(isinstance(A.func, MethodType))       # 方法
    print('------------------------------------------------------')
    a = A()
    print(a.func)  # 对象调用类的函数是-->方法
    print(isinstance(a.func, FunctionType))     # 函数
    print(isinstance(a.func, MethodType))       # 方法
    # 输出
    <function A.func at 0x014F3388>
    True
    False
    ------------------------------------------------------
    <bound method A.func of <__main__.A object at 0x015CF868>>
    False
    True
    面向对象中:pickle
    • 把对象序列化存储在文件中,需要用的时候在反序列化回来也可以调用类的方法和变量

    import pickle
    ​
    ​
    class Person:
        def __init__(self, name, age, sex, hobby, job):
            self.name = name
            self.age = age
            self.sex = sex
            self.hobby = hobby
            self.job = job
    ​
        def func(self):
            return f'{self.name}的方法'
    ​
    ​
    Bob = Person('鲍勃', '18', '', '熬夜', '攻城狮')
    Ali = Person('艾伦', '20', '', '看电视', '演员')
    ​
    with open('pickle_', mode='wb') as f1:
        pickle.dump(Bob, f1)
        pickle.dump(Ali, f1)
    ​
    with open('pickle_', mode='rb') as f2:
        B = pickle.load(f2)
        A = pickle.load(f2)
    ​
    print(B.name)
    print(A.func())
    # 输出
    鲍勃
    艾伦的方法
    学习之旅
  • 相关阅读:
    C#中任意类型数据转成JSON格式
    数据库用户映射到SQL Server登录名
    浅述WinForm多线程编程与Control.Invoke的应用
    Git错误一例
    提高VS2010/VS2012编译速度
    给有兴趣、有责任要讲课、分享的朋友推荐两本书
    中国剩余定理
    中国剩余定理
    洛谷1546 最短网路
    洛谷1111 修复公路
  • 原文地址:https://www.cnblogs.com/XiaoYang-sir/p/14725938.html
Copyright © 2011-2022 走看看