• day24 02 单继承(派生)


    day24 02 单继承(派生)

    1、首先来看一个简单的例子

    比如:

      狗类的属性有:吃,喝,看门

      鸟类的属性有:吃,喝,下蛋

    看门和下蛋就是这两种动物不同的属性,而吃喝是两个共同的属性

    以下代码实现了将一个子类的self传入父类中,然后实现了对共同属性的操作,也实现了不同属性的操作:

    class Animal:
        def __init__(self):  
            # 因为狗类中没有可执行的_init_文件,所以执行的是父类的,但是这里的self不再是Animal本身的self了,而是狗类创建的self
            print('执行Animal._init_')
            self.func()  # 因为传进来的是狗类的self也就是Dog,所以self.func=Dog.func
        def eat(self):
            print('%s eating'%self.name)
        def drink(self):
            print('%s drinking'%self.name)
        def func(self):
            print('Animal.func')
    
    class Dog(Animal):  # 创建了狗类的self,但是没有找到自身的_init_文件,所以会向父类中寻找
        def guard(self):
            print('guarding')
        def func(self):
            print('Dog.func')
    
    dog = Dog()  # 在这里调用的时候,执行的是Animal里面的init文件,但是在执行之前就在狗类里面先创建了一个狗类的self
    
    class Bird(Animal):
        def __init__(self):
            pass
    执行Animal._init_
    Dog.func

    2、继续使用人狗大战的游戏例子

    人类和狗类的相同属性:name,blood,aggr

    不同属性:人类有sex,money,狗类有kind

    它们的相同属性可以放在父类中,而不同的属性放在各自类里面,对相同属性与不同属性的操作如下:

    class Animal: # 父类
        # 子类拥有的共同属性
        def __init__(self,name,blood,aggr):  # 狗和人在游戏中拥有的共同属性种类
            self.name = name
            self.blood = blood
            self.aggr = aggr
    
        # 子类拥有的共同方法
        def Eat(self):
            print('吃药回血')
            self.blood += 100
    
    class dog(Animal):  # 子类
        def __init__(self,name,blood,aggr,kind):
            # dog类拥有的属性全部都传进去,并且创建dog的self,只有自己的init文件中没有的属性才会像父类寻求,即共同属性是通过父类执行
            Animal.__init__(self,name,blood,aggr)
            # 因为前面已经创建了dog自己的self,所以这里的self就是dog这个对象,执行_init_文件的同时,并将狗的self传入Animal中
            self.kind = kind  # 狗类的派生属性,也就是不同于人类的属性,也就是父类中不包括的属性
    
        def bite(self,someone):  # 派生方法
            someone.blood -= self.aggr
    
    # 下面的人类的有关分析与狗类的相同
    class someone(Animal):  # 子类
        def __init__(self,name,blood,aggr,sex,money):
            Animal.__init__(self,name,blood,aggr)
            self.sex = sex   # 人类的派生属性,也就是不同于人类的属性,也就是父类中不包括的属性
            self.money = money  # 人类的派生属性,也就是不同于人类的属性,也就是父类中不包括的属性
    
        def attack(self,dog):  # 派生方法
            dog.blood -= self.aggr
    
    dog1 = dog('溜溜球',200,500,'泰迪')
    print(dog1.name)
    person1 = someone('王昭君',300,500,'girl',1000)
    print(person1.name)
    print(dog1.kind)
    print(person1.sex)
    print(person1.money)
    print(dog1.Eat())
    print(person1.Eat())
    print(person1.blood)
    print(dog1.blood)

    运行结果:

    溜溜球
    王昭君
    泰迪
    girl
    1000
    吃药回血
    None
    吃药回血
    None
    400
    300

    3、小结

    • 父类中没有的属性,在子类中出现叫做派生属性
    • 父类中没有的方法,在子类中出现叫做派生方法
    • 只要是子类的对象调用,子类中有的名字一定用子类的,子类中没有的,才找父类的,如果父类也没有就会报错
    • 如果父类子类都有用子类的
    • 如果还想用父类的,单独调用父类的

    4、super关键字

    super关键字只在新式类中使用,python3中所有类都是新式类,在使用super的方法调用执行父类的init文件的时候,不需要再传self了:

    class animal: # 父类
        def __init__(self,name,blood,aggr):  # 狗和人在游戏中拥有的共同属性种类
            self.name=name
            self.blood=blood
            self.aggr=aggr
    class dog(animal):  # 子类
        def __init__(self,name,blood,aggr,kind):
            super().__init__(name,blood,aggr)
            # super方法调用执行父类的init文件,并且不用传self,会自动将self传进去,不像前面的Animal._init_的方法还需要传self
            # super关键字的使用只在新式类中有,python3中所有类都是新式类
            self.kind = kind  # 派生属性
        def bite(self,someone):
            someone.blood-=self.aggr
    class someone(animal):  # 子类
        def attack(self,dog):
            dog.blood -=self.aggr
    dog1 = dog('溜溜球',200,500,'泰迪')
    print(dog1.name)

    运行结果:溜溜球

    所以在子类当中调用父类方法有:

    • 父类名.方法名:需要自己传self参数
    • super().方法名:不需要自己传self参数
  • 相关阅读:
    Python3.7.1学习(六)RabbitMQ在Windows环境下的安装
    使用jmeter进行简单的压测
    python中mock的使用
    python-shutil模块
    python-常用模块之os、sys
    python-冒泡排序
    python-正则基础
    python-二维数组实现90度旋转
    python-使用递归实现二分法
    python-递归的实现
  • 原文地址:https://www.cnblogs.com/wxm422562/p/10896998.html
Copyright © 2020-2023  润新知