1、类的继承和定制 1-1、类的继承(财产被继承了) 类的继承,即让子类拥有了父类拥有的所有属性和方法 1-2、类的定制(“我就是我,是颜色不一样的烟火”) 子类也可以在继承的基础上进行个性化的定制,包括: 2、继承的编写规则 2-1、继承的基础语法 class A(): name='延君' class B(A): pass 以上代码的第 3 行, class B(A) 就是我们的继承语句,其中 B 是子类, A 代表着我们的父类。
我们的子类继承了父类,那就是说,父类的所有东西,我们子类都可以拿来用,下面我们来看一下例子: class A(): name='延君' class B(A): pass b=B() print(b.name) 我们父类 A 定义了变量 name 并赋值延君,而子类 B 继承了 A 但是什么都没操作(pass),我们实例化函数 B 后,实例化对象 b 可以调用我们父类 A 中的 name 属性。
2-2、类的多层继承 继承不仅可以发生在两个层级之间(即父类-子类),还可以有父类的父类、父类的父类的父类…… class shanjiao(): teacher1='七七' class shanyao(shanjiao): teacher2='延君' class shanding(shanyao): teacher3='卡西' tea = shanding() print(tea.teacher1) print(tea.teacher2) 上面例子中,类 shanyao 继承了类 shanjiao,类 shanding 再继承了类 shanyao ,即类 shanding 继承了前面两个的所有属性,所以可以正常打印出我们的“七七”、“延君”。 2-3、类的多重继承 一个类,可以同时继承多个类,语法为 “class A(B,C,D):” 。和子类更相关的父类会放在更左侧,子类创建的实例在调用属性和方法时,会先在左侧的父类中找,找不到才会去右侧的父类找。(可理解为“就近原则”) class shanjiao(): teacher='七七' class shanyao(): teacher='延君' class shanding(): teacher='卡西' class main(shanyao,shanjiao,shanding): pass tea = main() print('助教'+tea.teacher+'最帅') 以上代码中,类 main 同时继承了我们的类 shanjiao、shanyao、shanding,而根据我们的“就近原则”,我们在调用属性 teacher 的时候,类 shanyao 离我们的子类最近且有定义该类,所以打印出来的结果为 “助教延君最帅”。
3、定制的编写规则 3-1、新增代码 在子类下新建属性或方法,让子类可以用上父类所没有的属性或方法。这种操作,属于定制中的一种:新增代码 class A(): name='延君' def Face(self): print('帅') class B(A): work='助教' def Age(self): print('年轻')
b=B() print(b.name) print(b.work) b.Face() b.Age() 以上代码中,类 B 继承了类 A ,我们实例化了类 B 后,可以调用父类的属性和方法外,也可以给子类新增子类的属性和方法。 3-2、重写代码 ①、重写代码,是在子类中,对父类代码的方法修改: class A(): def Day(self): print('昨天是day2') class B(A): def Day(self): print('今天是day3') a=A() b=B() a.Day() b.Day() 以上代码中,我们子类 B 继承了父类 A,并且重写了方法 Day,即我们用类 B 的实例化对象去调用方法 Day 的时候,会打印出 “今天是day3”。 ②、在子类中,对父类代码的实例化属性修改: class A(): def __init__(self,name='卡西'): self.name=name def Name(self): print('我的名字是'+self.name) class B(A): def __init__(self,name='延君'): A.__init__(self,name) b=B() b.Name() 以上代码中,我们子类 B 继承了父类 A,调用父类的初始化函数后,重新给参数 name 赋值,再给这个 name 给实例化对象 name,具体传参路线如下:
4、习题 ①、题目:公司近期想总结一下助教们的名片信息,以下为收集兴趣和名字时的代码,卡西认为自己作为子类,代码还可以更简便一些,请对子类的初始化函数进行修改,让代码更加简洁。 class Teachers: def __init__(self,hobby,name=,city='深圳'): self.name=name self.hobby=hobby self.city=city def say_hello(self): print('大家好,我是来自{}的{},喜欢{}'.format(self.city,self.name,self.hobby)) class Kaxi(Teachers): def __init__(self,hobby,name='助教卡西',city='深圳'): self.name=name self.hobby=hobby self.city=city def say_hello(self): print('hello,小可爱我是来自{}的{},喜欢{}'.format(self.city,self.name,self.hobby)) kaxi=Kaxi('唱歌') kaxi.say_hello() 答案: class Teachers: def __init__(self,hobby,city,name='助教'): self.name=name self.hobby=hobby self.city=city def say_hello(self): print('大家好,我是来自{}的{},喜欢{}'.format(self.city,self.name,self.hobby)) class Kaxi(Teachers): def __init__(self,hobby,name='助教卡西',city='深圳'): Teachers.__init__(self,hobby,name,city) def say_hello(self): print('hello,小可爱我是来自{}的{},喜欢{}'.format(self.city,self.name,self.hobby)) kaxi=Kaxi('唱歌') kaxi.say_hello() 解析:在继承时,若方法名相同则默认为改写,当只需改写父类方法中的一小部分时,可在改写的方法内部调用父类的方法,再将需要补充的部分写在下方即可。 ②、题目:以下代码执行后的结果是? class A(): id='五法天女' class B(): id='无发天女' class C(): id='舞法天女' class D(): id='' class main(B,C): pass m=main() print(m.id)
A、无发天女, B、舞法天女 C、舞法天女,无发天女 D、无发 答案:D 解析:m 实例化了类 main,再调用了类 main 的属性:id 。其中类 main 继承了类 B、C,由我们就近为最亲的规则,我们先在类 main 中搜索,找不到属性“id”,再到类 B 中去搜索是否有,而类 B 中有属性 id = ‘无发天女’ ,故最后打印出来的值为 无发天女。
|