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文件,但是在执行之前就在狗类里面先创建了一个狗类的selfclass 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 += 100class 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.aggrdog1 = 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)
运行结果:
溜溜球王昭君泰迪girl1000吃药回血None吃药回血None400300
3、小结
- 父类中没有的属性,在子类中出现叫做派生属性
- 父类中没有的方法,在子类中出现叫做派生方法
- 只要是子类的对象调用,子类中有的名字一定用子类的,子类中没有的,才找父类的,如果父类也没有就会报错
- 如果父类子类都有用子类的
- 如果还想用父类的,单独调用父类的
4、super关键字
super关键字只在新式类中使用,python3中所有类都是新式类,在使用super的方法调用执行父类的init文件的时候,不需要再传self了:
class animal: # 父类 def __init__(self,name,blood,aggr): # 狗和人在游戏中拥有的共同属性种类 self.name=name self.blood=blood self.aggr=aggrclass 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.aggrclass someone(animal): # 子类 def attack(self,dog): dog.blood -=self.aggrdog1 = dog('溜溜球',200,500,'泰迪')print(dog1.name)
运行结果:溜溜球
所以在子类当中调用父类方法有:
- 父类名.方法名:需要自己传self参数
- super().方法名:不需要自己传self参数