本文研究的主要是Python面向对象之继承的相关内容,具体如下。
Python 继承
即一个派生类(derived class)继承基类(bass class)字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计,一个Cat类型的对象派生自Animal类,这是模拟”是一个(is-a)”关系(例如,Cat是一个Animal)。
继承实现了代码的重用。
继承的基本语法:
class 派生类名(基类名1 [, 基类名2....]):
基类名写在括号里,基本类是在类定义的时候,在元组之中指明的。如果在继承元组中列了一个以上的类,那么它就被称作”多重继承” 。
多重继承
Python支持多重继承,也就是一个子类可以有多个父类,父类间用逗号隔开。
在多重继承中,子类有那么多的父类,那子类实例化时,构造方法是怎样调用的呢?
这里需要记住一点:
多重继承中,构造方法以第一个父类为中心。如果子类重新定义了构造方法,就不会调用父类的构造方法,构造就会只调用第一个父类的构造方法,并且如果父类中有同名的方法时,通过子类的实例对象去调用的该方法也是第一个父类中的方法。当然如果你需要在子类中用来某个或某几个父类的构造方法,需要显示的去调用父类的构造方法。
在python中继承中的一些特点:
- 在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
- 在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数。
- Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
- 子类只继承父类所有公有的属性和方法,并且也可以在子类中通过父类名来调用,而对于私有的属性和方法,子类是不进行继承的,因此在子类中是无法通过父类名来访问的。
实例:
class Parent(object): # define parent class parentAttr = 100 def __init__(self): print "Calling parent constructor" def parentMethod(self): print 'Calling parent method' def setAttr(self, attr): Parent.parentAttr = attr def getAttr(self): print "Parent attribute :", Parent.parentAttr class Child1(Parent): # define child1 class def __init__(self): print "Calling child1 constructor" def childMethod(self): print 'Calling child1 method' Parent.parentMethod(self) #调用基类的方法,所以要加上参数self class Child2(Parent): # define child2 class def childMethod(self): print 'Calling child2 method' self.parentMethod() #子类调用自己从父类那继承过来的父类的方法 c1 = Child1() # 实例化子类 1 c2 = Child2() # 实例化子类 2 c1.childMethod() # 调用子类的方法 c2.childMethod() # 调用子类的方法 c1.parentMethod() # 调用父类方法 c1.setAttr(200) # 再次调用父类的方法 c1.getAttr() # 再次调用父类的方法
执行结果:
Calling child1 constructor
Calling parent constructor
Calling child1 method
Calling parent method
Calling child2 method
Calling parent method
Calling parent method
Parent attribute : 200
解析:
c1 = Child1() # 实例化子类 1 c2 = Child2() # 实例化子类 2
这两句是创建Child1类和Child2类的实例对象,创建实例对象时,就会自动去调类的构造方法,如果子类中没有建立自己的构造方法,就会调用父类的构造方法,所以打印结果为:
Calling child1 constructor
Calling parent constructorc1.childMethod() # 调用子类的方法
c2.childMethod() # 调用子类的方法
上面两句分别调用的是对应子类的子类方法,由于在子类中都分别有调用父类的方法,所以打印结果为:
Calling child1 method
Calling parent method
Calling child2 method
Calling parent method
注意:
子类继承父类以后,如果在子类在对父类的方法进行改造时,由需要用到父类的方法时,这个时候在子类中想要调用父类的方法时,该怎么做呢?有两种方法:
- Parent.parentMethod(self)
- self.parentMethod()
第一种是直接用父类的类名.方法名去调用父类的方法,但是需要注意的时,这种调用方法必须将self作为参数传进去并且作为第一个参数,表示指向指向这个类的实例本身。
第二种是直接用self去调用父类的方法,为什么可以这样调用呢?因为一旦子类继承了父类,那么子类就拥有父类所有的方法和属性,所以此时父类的方法和属性就相当于子类自己了,所以可以直接用self去直接调用实例的方法,而不用再传入self参数了。
使用issubclass()或者isinstance()方法来检测类之间的关系:
- issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类, 语法:
issubclass(sub,sup)
。 - isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true。
总结
以上就是本文关于Python面向对象之继承代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 群星《歌手2024 第13期》[FLAC/分轨][325.93MB]
- 阿木乃《爱情买卖》DTS-ES【NRG镜像】
- 江蕾《爱是这样甜》DTS-WAV
- VA-Hair(OriginalBroadwayCastRecording)(1968)(PBTHAL24-96FLAC)
- 博主分享《美末2RE》PS5 Pro运行画面 玩家仍不买账
- 《双城之战2》超多新歌MV发布:林肯公园再次献声
- 群星《说唱梦工厂 第11期》[320K/MP3][63.25MB]
- 群星《说唱梦工厂 第11期》[FLAC/分轨][343.07MB]
- 群星《闪光的夏天 第5期》[320K/MP3][79.35MB]
- 秀兰玛雅.1999-友情人【大旗】【WAV+CUE】
- 小米.2020-我想在城市里当一个乡下人【滚石】【FLAC分轨】
- 齐豫.2003-THE.UNHEARD.OF.CHYI.3CD【苏活音乐】【WAV+CUE】
- 黄乙玲1986-讲什么山盟海誓[日本东芝版][WAV+CUE]
- 曾庆瑜1991-柔情陷阱[台湾派森东芝版][WAV+CUE]
- 陈建江《享受男声》DTS-ES6.1【WAV】