哈尔滨网站建设工作室,汉滨网站建设,泰安放心的企业建站公司,如何做网站好看专栏#xff1a;python 个人主页#xff1a;HaiFan. 专栏简介#xff1a;Python在学#xff0c;希望能够得到各位的支持#xff01;#xff01;#xff01; 关联与继承前言has a关联关系is a继承关系子类不添加__init__子类添加__init__前言 has a关联关系 has - a 是在… 专栏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 lisiself.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 lisiself.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()