继承与合成
在阅读本文之前,你只需要记住我这一句:
大部分使用继承的场合后可以用合成来取代,而多重继承则需要不惜一切地避免之。
首先我详细介绍一下继承的概念:
'''
④为什么要用super():
其实我在上面已经隐隐约约地给出了答案,就是要应对一个叫“多重继承”的麻烦东西。
多重继承是指定义的类继承了多个类,就像这样:
class SuperFun(Child,BadStuff):
pass
也就是说,创建一个叫SuperFun的类,让它同时继承Child和BadStuff。
这样一来一旦在SuperFun的实例上调用任何隐式动作,Python就要回到类的层次结构中以固定的次序去检查,这样会很麻烦吧。
所以super()就在这个形势下诞生了,再也不用担心把继承关系弄糟,因为会正确快速地找到需要的函数。
super()和__init__搭配使用:
这是最常见的super()与基类的__init__函数搭配使用,在子类里做了一些事情,然后完成对父类的初始化。
class Child(Parent):
def __init__(self,stuff):
self.stuff=stuff
super(Child,self).__init__()
'''
'''
⑤合成:
继承虽然是一种有用的技术,不过还有一种实现相同功能的方法,就是直接使用别的类和模块,而非依赖于继承。
'''
class Other(object):
def override(self):
print("OTHER override()")
def implicit(self):
print("OTHER implicit()")
def altered(self):
print("OTHER altered()")
class Child(object):
def __init__(self):
self.other=Other()
def implicit(self):
self.other.implicit()
def override(self):
print("CHILD override()")
def altered(self):
print("CHILD,BEFORE OTHER altered()")
self.other.altered()
print("CHILD,AFTER OTHER altered()")
son=Child()
son.implicit()
son.override()
son.altered()
'''
先来看看输出结果吧:
OTHER implicit()
CHILD override()
CHILD,BEFORE OTHER altered()
OTHER altered()
CHILD,AFTER OTHER altered()
开始的时候,你可能看不懂输出结果,我现在来给你整理一下思路。
很明显,类Other和类Child并没有父类子类的关系,而是一个平等的关系。
但是我们可以看到类Child的__init__函数中有类Other,这就是“A里有B”的关系。
这些过程就是一个引用的过程,比如son.implicit():
son是类Child的一个实例,然后调用son.other.implicit(),
在__init__中,son.other是等于Other(),所以调用的这一句是等同于Other().impicit(),
所以输出结果自然就成了类Other里的implicit()函数的打印信息。
这种方式就叫做合成,不需要继承关系,而是选择了“A里面有B”的引用方式,能有效避免多种继承。
'''
'''
⑥继承和合成的应用场合:
“继承和合成”的问题说到底还是为了解决关于代码复用的问题,什么时候用哪一种方式取决于你的需求。
继承可以让你在基类里隐含父类的功能,从而解决这个问题。
合成则是利用模块和别的类中的函数调用达到了相同的目的。
以下是一些老程序员的建议:
1.不惜一切代价地避免多重继承,因为它带来的麻烦比能解决的问题都多。如果非要用,
那得准备好专研类的层次结构,以及花时间去找各种东西的来龙去脉。
2.如果有一些代码会在不同位置和场合应用到,那就用合成来把它们做成模块。
3.只有在代码之间有清楚的关联,可以通过一个单独的共性联系起来的时候使用继承,
或者受现有代码或者别的不可抗拒因素所限非用不可,那也用吧。
'''
希望你已经理解了继承与合成,与此同时,我要恭喜你,你已经有了自食其力的能力了。
现在你需要制作一个游戏。在这儿,我有一些建议要告诉你:
①函数的风格:
学会合理使用继承与合成;
让函数保持简洁小巧;
不要让某一个函数做太多的事情。
②类的风格:
类的命名使用"驼峰式大小写",例如SuperMan,ComeOn等等;
__init__不应该做太多的事情;
类下面定义的函数名称不要用驼峰式大小写,用别的;
用一致的方式组织函数的参数,如果类处理users,dogs和cats,请在其它地方也保持这个次序。
③代码的风格:
合理使用空行;
每行不超过80个字符;
让自己的代码整体看起来简洁美观一点;
④好的注释:
养成注释的好习惯;
写注释的时候描述清楚为什么要这样做;
让注释尽量看起来短小精悍;
⑤客观评价你的代码;
主动反思代码有哪些不能实现的功能;
当你不能很好地实现可能存在的情况,请在注释里写出来。
祝你能顺利写出一个好游戏!