- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
44 :继承Vs.包含
练习44.继承Vs.包含
在有关英雄战胜邪恶的童话中,总是有某种形式的⿊暗森林。它可能是⼀个⼭ ,森
林,另⼀个星球或者其他地⽅,每个⼈都知道英雄不应该去。当然,当不就之后坏⼈
被你找到的时候,你发现,英雄已经去那个愚蠢的森林⾥杀坏⼈去了。看起来英雄进
⼊了⼀种状态,这种状态要求英雄必须在这个邪恶的森林中冒险。
在⾯向对象编程中,继承就是那个⿊暗森林。有经验的程序员知道要避免这种邪恶,因
为他们知道,⿊暗森林深处有着多重继承这个邪恶的皇后。 她喜欢那她那庞⼤的⽛齿
吃掉软件和程序员。但这个森林是如此强⼤,如此诱⼈,⼏乎每⼀个程序员都必须进
⼊它,与邪恶的皇后战⽃,尽量做到全⾝⽽退,才可以称⾃⼰是真正的程序员。你不
能抗拒的继承森林的诱惑,所以你进去了。冒险之后,你试着远离那个邪恶的森林,
当你再次被迫进⼊的时候,你会携带⼀⽀军队进⼊ (这段翻译的太烂了,实在没办法
把编程和童话联系起来 !)
这是⼀种有趣的⽅式来解说我要在这节练习教你的东西,它叫做继承,当你使⽤它的
时候,⼀定要当⼼再当⼼。正在森林⾥和⼥王战⽃的程序员可能告诉你你必须进去。
他们这么说是因为他们需要你的帮忙,可能因为他们创建了太多他们已经⽆法掌控的
东西。但是你⼀定要记得:
⼤多数继承的⽤途,可以简化或⽤组合物所取代,并应不惜⼀切代价避免多重继承。
什么是继承
继承是⽤来描述⼀个类从它的⽗类那⾥获得⼤部分甚⾄全部⽗类的功能。当你写
下class Foo(Bar)的时候,就发⽣了继承,这句代码的意思是“创建⼀个叫做Foo
的类,并继承Bar” 。当你执⾏这句的时候,编程语⾔使得Foo的实例所有的⾏为都跟
Bar的实例⼀样。这么做,可以让你在类Bar中放⼀些通⽤功能,⽽那些需要特殊定
制的函数或功能可以放在类 Foo 中。
当你需要做这些特殊化函数编写的时候,⽗⼦类之间有3 中交互⽅法:
1. ⼦类的⽅法隐性继承⽗类⽅法
2. ⼦类重写⽗类的⽅法
3. 对⼦类的操作改变⽗类
我将按顺序给你展⽰这3种交互⽅式,并给你看它们的代码。
隐性继承
⾸先,我将给你展⽰的是隐性继承发⽣在你在⽗类中定义了⽅法,⽽在⼦类中没有:
class Parent(object):
def implicit(self):
print PARENT implicit()
class Child(Parent):
pass
dad Parent()
son Child()
dad.implicit()
son.implicit()
在class Child下使⽤pass的⽬的是告诉Python ,在这⾥你想要⼀个空⽩的块。这
⾥创建了⼀个叫做Child的类,但是没有在这个类中定义任何性的⽅法。它将从
类Parent继承获得所有的⽅法。当你执⾏这段代码的时候,你会看到:
$ python ex44a.py
PARENT implicit()
PARENT implicit()
注意⼀下,尽管我再代码的13⾏调⽤了son.implicit(),⽽类Child并没有⼀个
定义叫做implicit的⽅法,代码仍然正常⼯作了,因为它调⽤了Parent中定义的
同名⽅法。这个⾼速你的是:如果你在基类(i .e ., Parent) 中定义了⼀个⽅法,那么所
有的⼦类(i .e ., Child) 都可以⾃动的获得这个功能。对于你需要在很多类中有重复的
⽅法来说,⾮常⽅便。
重写⽅法
关于有些⽅法是隐式调⽤的问题原因在于有时候你想让⼦类有不同的表现。这时你想
重写⼦类中的⽅法且有效的覆盖⽗类中的⽅法。要做到这⼀点,你只需要在⼦类中定
义⼀个同名的⽅法就⾏,例如
class Parent(object):
def override(self):
print PARENT override()
class Child(Parent):
def override(self):
print CHILD override()
dad Parent()
son Child()
dad.override()
son.override()
在这个例⼦中,两个类中我都有⼀个叫做override的⽅法,所以让我们来看看当你
运⾏此例时都发⽣了什么
$ python ex44b.py
PARENT override()
CHILD override
文档评论(0)