在编程重复的代码是很不好的,不应该在很多地方有多份相同或类似的代码副本。
把具有相似功能的代码片段或者对象合并起来的方法有多种,这一章主要讲继承。
继承允许我们在两个或多个类之间创建一种“是一个”的关系,这种关系把共通的特性抽象到一个超类,特有的细节存于子类中。
基本继承
从就上来讲,每一个类都使用了继承,所有的Python类都是一个叫做object
的特殊类的子类。这个类提供了非常少的数据和行为(这些它提供的行为都是以双下划线开头的方法,这些方法都只供内部使用。)
如果不指明我的类的继承,那这个类自动从object
继承过来。我们也可以公开声明从object
类继承。:
class MyClass(object):
pass
这个object
就是MyClass
的超类,也叫父类,指被继承的类。子类是继承过来的类,如MyClass
。我们可以说一个子类来源于父类。或者说这个子类扩展了父类。
那么如何应用,最基本的功能就是使用继承为父类添加功能。
我们从一个简单的通讯录开始,这个通讯录可以记录一些人的姓名和电子邮件地址。contact类负责维护一个类变量中所有联系人的列表,并初始化姓名和地址:
class Contact:
all_contacts = []
def __init__(self,name,email):
self.name = name
self.email = email
Contact.all_contacts.append(self)
all_contacts这个列表是一个类变量,它属于类定义的一部分,被所有这个类的实例共享。这意味着有且只有一个Contact.all_contacts列表。我们在任意一个对象中调用self.all_contacts,会引用这个列表。在初始化函数中的代码Contact.all_contacts.append(self)
保证了无论何时我们创建一个新的contact类,这个列表都会自动把这个对象添加进来。
这是一个很简单的类,它允许我们记录关于联系人的一些信息。如果我们的某些联系人同时是需要从他们那里订购东西的供应商该怎么办。我们可以给Contact添加一个order方法,但这样会导致所有的联系人都可以订购东西。所以我们可以新建一个Supplier类,和Contact类一样,但是它有额外的order方法:
class Supplier(Contact):
def order(self,order):
print("If this wera a real system we would send ""{} order to {} ".format(order,self.name))
#注意此处也可以这样写:
#print("If this w