Python---关联与继承
专栏:python
个人主页:HaiFan.
专栏简介:Python在学,希望能够得到各位的支持!!!
关联与继承
- 前言
- has a关联关系
- is a继承关系
-
- 子类不添加__init__
- 子类添加__init__
前言
has a关联关系
has - a 是在一个类中使用了另一种自定义的类型。
看代码
import randomclass Road:def __init__(self,name,len):self.name = nameself.len = lenclass Car:def __init__(self,brand,speed):self.brand = brandself.speed = speeddef get_time(self,road):ran_time = random.randint(1,10)msg = f'{self.brand}品牌的车在{road.name}上以{self.speed}速度行驶了{ran_time}个小时'print(msg)def __str__(self):return f'{self.brand}品牌的\\n速度{self.speed}'r = Road('nb',111)c = Car('shangtian',130)print(c)c.get_time(r)
这个代码中的 get_time
中的road
和r是一样的,指向同一块空间,如果在传参的时候,不传r对象,那么,get_time
里面是没有name这个属性的,r可以.调用属性,road.也可以调用属性
我把这个r对象中的name进行更改,因为r和road
指向的是同一块空间,所以,r.name改变之后,road.name也会改变
- has a
一个类中使用了另一种自定义类型就是关联关系
如上面代码中c对象中的参数是r对象
is a继承关系
is - a简单来说就是继承关系,类的父子继承关系。
子类不添加__init__
在以后的开发过程中,我们会碰到很多情况,比如,让我们写多个类:医生类,学生类等等,在每一个类里面,都会写名字,性别,年龄等,一个一个的类写是比较繁琐的,在这里,Python给出了解决办法
class Student:def __init__(self,name,age):self.name = nameself.age = agedef eat(self):print(f'{self.name}正在吃饭')class Doctoe:def __init__(self, name, age):self.name = nameself.age = agedef eat(self):print(f'{self.name}正在吃饭')
这个代码中,有着很多重复的代码,并且这些类都有一个共同的特征,那么就可以提取出来他们共同的部分,写做一个类,将其共同的特征都写入这个类中。这个类就是父类
class Person:def __init__(self,name,age):self.name = nameself.age = agedef eat(self):print(f'{self.name}正在吃饭')class Student:passclass Doctoe:passa = Student()a.eat()
在创建出a对象之后,这个对象是找不到eat这个方法的。
因为Student类中为pass
那么,如何让提取出来的共同特征在下面的类中都能体现出来呢?
这就用到了继承关系,把人这一类称为父类,把属于人这一类的类,称为子类。
class 父名字:pass
class 类名(父类名字):pass
为什么在继承之后,还会出现阴影?子类继承父类后,会受到父类的影响,因为父类的__init__有name和age参数,所以子类中也有这两个参数,所以会出现阴影
class Person:def __init__(self,name,age):self.name = nameself.age = agedef eat(self):print(f'{self.name}正在吃饭')class Student(Person):passclass Doctoe(Person):passa = Student('lise',19)
a.eat()
我们创建一个类,默认继承是object,在Python3中,我们不写(object),默认继承object
我们知道,Python代码是依次执行的,所以再上面的代码中,会先通过__new__魔术方法开辟一段空间,然后把空间传给__init__.
这个__new__是object的,如果自己没有就会先去父类找,父类没有,就会去object找,再比如__init__,Student类里面是没有这个魔术方法的,那么就会先去父类找。
本层找不到,就去上层找
子类添加__init__
lass Person:def __init__(self):self.name = 'lisi'self.age = 19def eat(self):print(f'{self.name}正在吃饭')def run(self):print(f'{self.namme}正在跑步')class Student(Person):def __init__(self):print('-------init')class Employee(Person):passclass Doctor(Person):passa = Student()
创建a对象,然后运行代码,会打印出执行__init__的结果。
如果再加一个a.eat()呢?
这就错了。
那么,如何调用父类的 __init__
呢?
这里我们用到了 super
关键字
如何调用父类 __init__
super(). __init__(参数)
super(类名,对象).__init__(参数)
class Person:def __init__(self):self.name = 'lisi'self.age = 19def eat(self):print(f'{self.name}正在吃饭')def run(self):print(f'{self.namme}正在跑步')class Student(Person):def __init__(self):print('-------init')super().__init__()
class Employee(Person):passclass Doctor(Person):passa = Student()
-
如果类中不定义
__init__
,就调用父类的__init__
-
如果类继承父类也需要定义自己的
__init__
,就需要在当前类的__init__
调用一下父类__init__
-
如何调用父类
__init__
super(). __init__(参数)
super(类名,对象).__init__(参数)
-
如果父类有eat(),子类也定义一个eat方法,默认搜索原则:先找当前类,再去找父类。
父类提供的方法不能满足子类的需求,就需要在子类中定义一个同名的方法,这种行为叫做:重写 override\\
-
子类的方法中也可以调用的父类的方法,
super().eat()