关于学习Python的一点学习总结(35->关联超类)

news/2024/7/2 23:20:35

76.调用为关联的超类(继承的类)构造函数
先举个例子:

 class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print('Aaaah ...') self.hungry = False else: print('No, thanks!')class SongBird(Bird): def __init__(self): self.sound = 'Squawk!' def sing(self): print(self.sound)输出:>>> b=Bird()>>> b.eat()Aaaah ...>>> b.eat()No, thanks!>>> sb=SongBird()>>> sb.eat()Traceback (most recent call last):File "<pyshell#84>", line 1, in <module>sb.eat()File "E:/python/子类.py", line 5, in eatif self.hungry:AttributeError: 'SongBird' object has no attribute 'hungry'
 可以看到这个sb.eat()报错了,为什么呢?因为在SongBird中重写了构造函数,但新的构造函数没有包含任何初始化属性hungry的代码。我们可以将重写的构造函数去掉试一下:
  class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print('Aaaah ...') self.hungry = False else: print('No, thanks!')class SongBird(Bird): def sing(self): print(self.sound)输出:>>> b=SongBird()>>> b.eat()Aaaah ...>>> b.eat()No, thanks!
      可以看出当去掉重写的构造函数之后,错误没有了,所以要解决这个问题以下有两种方法:方法一:就是调用未关联的超类构造函数
  class SongBird(Bird): def __init__(self):Bird.__init__(self)self.sound = 'Squawk!' def sing(self): print(self.sound)输出:>>> sb=SongBird()>>> sb.eat()Aaaah ...>>> sb.eat()No, thanks!
 结论:对实例调用方法时,方法的参数self将自动关联到实例;如果通过类调用方法(如:Bird.__init__),就没有实例与其相关联;所以可以随便设置参数self。方法二:使用super函数
 class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print('Aaaah ...') self.hungry = False else: print('No, thanks!')class SongBird(Bird):def __init__(self):super().__init__()self.sound='Squawk'def sing(self): print(self.sound)输出:>>> b=SongBird()>>> b.sing()Squawk>>> b.eat()Aaaah ...>>> b.eat()No, thanks!
  调用super函数时,将当前类和当前实例作为参数,对其返回的对象调用方法时,调用的将是超类(而不是当前类)的方法。
super优点总结:1.即使有多个超类,也是需要调用函数super一次,但是所有的超类的构造函数也使用super函数;2.使用super函数比调用未相关联的构造函数要好的多;3.无需关心super返回的是什么(只需要假定返回的是所需要的超类即可);但是事实上返回的是一个super对象,这个对象将负责为你执行方法解析。当访问它的属性时,它将在所有的超类中查找,直到找到指定的超类的属性或者报错。4.相对于旧式类,如果两个超类从同一个类派生出来,在使用新式类和函数super时将自动得到处理(而且无需知道super工作原理)。

http://lihuaxi.xjx100.cn/news/286934.html

相关文章

这样学算法,包会包懂so easy~

整理 | Jane出品 | AI科技大本营面试前&#xff0c;大家都会开始刷各类网站&#xff0c;希望能在算法之道上有所进益&#xff0c;也期待有幸能在面试中碰上原题&#xff0c;而在那么多的网站中&#xff0c;LeetCode 一定是候选学习的网站之一。但是 LeetCode 网站上的题量和难度…

p6安装后怎么连接oracle的数据库,p6-oraclexe数据库连接不上处理方法内部版20151012.doc...

p6-oraclexe数据库连接不上处理方法内部版20151012.doc 问题P6出现无法连接数据库修改SYSTEM密码SQLCONN/ASSYSDBA已连接。SQLPASSWORDSYSTEM更改SYSTEM的口令新口令重新键入新口令口令已更改SQLALTERUSERSYSTEMIDENTIFIEDBYMANAGER用户已更改。修改P6ADMIN的密码CONNSYSASSYSD…

10种Git技巧,让你省时省力又省心!

图片来源&#xff1a;unsplash.com/sam_truong1. 从另一分支切换单个文件大家是否曾销毁文件只为能重新开始? 或需要在另一分支的某文件中进行更改&#xff1f;而git指令可以实现从另一分支切换文件。git checkout some-other-branch -- yarn.lock同时&#xff0c;也可以使用相…

启动mysqld报 mysql the server quit without updating pid file

查看mysql服务器的错误日志有一句&#xff1a; InnoDB: mmap(137363456 bytes) failed; errno 12 原来是内存不够用&#xff08;需要131MB&#xff09;呀&#xff0c;把my.cnf中的innodb_buffer_pool_size值修改成8M解决问题 这个弄好好,发现服务器上的wordpress任然报“数据库…

博弈论入门1

博弈论 1.是二人或多人在平等的对局中各自利用对方策略变换自己的对抗策略&#xff0c;达到取胜目标的理论。 2.博弈论是研究互动决策的理论。博弈可以分析自己与对手的利弊关系&#xff0c;从而确定自己在博弈中 3.的优势&#xff0c;因此有不少博弈理论&#xff0c;可以帮助对…

Oracle导入csv数据字符集,用SQLLDR把.CSV文件导入到数据库时,出现无法定位字符集句柄以用于字符集标识(0)...

LOAD.CTL文件内容:load datareplace into table js_clk_loadfields terminated by "," optionally enclosed by "(bh,mc,xhgg,dw,sl,qt1,qt2,scdj,qt3,qt4,qt5,scj)T--0001.CSV内容为:编号 材 料 名 称 规 格 型 号 单位 数量 …

上映 10 天,票房就突破 10 亿的《海王》真的有那么好看?

出品&#xff1a;CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;写在前面本文将主要通过Python加上一些数据分析&#xff0c;来证明《海王》好看。《海王》一部电影带你重温《驯龙高手》《变形金刚》《星球大战》《星河战队》《铁血战士》《安德的游戏》《异形》可能还借…

Python实现微信防撤回

微信&#xff08;WeChat&#xff09;是腾讯公司于2011年1月21日推出的一款社交软件&#xff0c;8年时间微信做到日活10亿&#xff0c;日消息量450亿。在此期间微信也推出了不少的功能如&#xff1a;“摇一摇”、“漂流瓶”、“朋友圈”、“附近的人”、“公众平台”、“小程序”…