继承允许我们在两个或者更多的类之间创建一种“是一个”的关系,这种关系把共同的细节抽象到一个超类里。

从技术上讲,每一个我们创建的类都使用了继承,所有的python类都是一个叫做object的特殊类的子类,如果我们不具体指明我们的类从其他类继承,那这个类自动从object继承过来。通过如下的语法,我们可以公开声明我们的类从object继承:

class MySubClass(object):
pass

其中,object就是父类或者说是超类。MySubClass是子类。可以说是子类来源于父类,或者说是子类扩展了父类。

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类,这个列表会自动把这个对象添加进来。要小心这种用法,因为如果曾经使用self.all_contacts给这个变量赋值,那么将会在这个对象里面创建一个新的实例变量,这个类变量将会保持不变并且可以通过Contact.all_contacts访问到。

如果需要在联系人中添加供应商信息,则如下:

class Supplier(Contact):
def order(self, order):
print("If this were a real system we would send "
"{} order to {}".format(order, self.name))

将上述的两端代码保存为脚本,然后使用python -i导入这个脚本,在交互的解释器中执行如下的语句

$ python -i order.py
>>> c = Contact("Some Body", "somebody@example.net")
>>> s = Supplier("Supplier", "supplier@example.net")
>>> print(c.name, c.email, s.name, s.email)
Some Body somebody@example.net Supplier supplier@example.net
>>> c.all_contacts
[<__main__.Contact object at 0x106eeefd0>, <__main__.Supplier object at 0x106f0f048>]
>>> c.all_contacts[0]
<__main__.Contact object at 0x106eeefd0>
>>> c.all_contacts[0].name
'Some Body'
>>> c.all_contacts[1].name
'Supplier'
>>> c.all_contacts[1].email
'supplier@example.net'
>>> c.all_contacts[0].email
'somebody@example.net'
>>> c.order("I need pliers")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Contact' object has no attribute 'order'
>>> s.order("I need pliers")
If this were a real system we would send I need pliers order to Supplier
>>>

那么现在我们的Supplier类可以做任何Contact类可以做的事情,包括把自己添加到all_contacts这个列表中,和一个供应商需要处理的所有特殊的事情。这就是继承的魅力。

参考:

1、《Python3 面向对象编程》 [加]Dusty Philips 著

python对象继承的更多相关文章

  1. Python对象继承set类型

    Python对象继承set类型 class Feature(set): def __init__(self): set.__init__(self) # 这里演示将Feature类的加号重载成set. ...

  2. python基础——继承和多态

    python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...

  3. Python对象体系揭秘

    Guido用C语言创造了Python,在Python的世界中一切皆为对象. 一.C视角中的Python对象 让我们一起追溯到源头,Python由C语言实现,且向外提供了C的API http://doc ...

  4. Python进阶-继承中的MRO与super

    Python进阶-继承中的MRO与super 写在前面 如非特别说明,下文均基于Python3 摘要 本文讲述Python继承关系中如何通过super()调用"父类"方法,supe ...

  5. python基础——继承与派生、组合

    python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...

  6. PYTHON-面向对象 继承 派生

    1. 什么是继承 继承是一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类 继承有3个特点: 1. 子类可以遗传/重用父类的属性(解决类与类之间代码冗余的问题) 2. 在p ...

  7. Python对象(上)

    Python是一门面向对象的语言,在Python中一切都是对象,函数是对象,类型也是对象. 下面就看看Python中对象相关的内容. Python对象基本概念 Python对象有三个基本的要素: 身份 ...

  8. [py]python的继承体系-源码目录结构

    python3安装目录 pip install virtualenv pip install virtualenvwrapper pip install virtualenvwrapper-win m ...

  9. [py]python的继承体系

    python的继承体系 python中一切皆对象 随着类的定义而开辟执行 class Foo(object): print 'Loading...' spam = 'eggs' print 'Done ...

随机推荐

  1. React Router 4.0 基本使用

    路由的概念,起初来源于服务端,就是当浏览器访问一个网站的不同页面时,服务端能够正确的返回页面的内容.当访问首页时,它能返回首页的内容,访问关于我们页面时,返回关于我们的内容.可以看到路由就是一种控制和 ...

  2. css溢出显示省略号

    单行溢出省略号 .show-detail li .info-name { width:278px; display:inline-block; /*下面是重点*/ overflow: hidden; ...

  3. IntelliJ IDEA通过Tomcat启动项目过程分析

    Tomcat部署项目的多种方式 Tomcat安装目录:${TOMCAT_HOME} 1.常规的webapps下直接部署到${TOMCAT_HOME}/webapps下 2.利用控制台进行部署 3.外部 ...

  4. Python Argparse模块

    argparse模块 在Python中,argparse模块是标准库中用来解析命令行参数的模块,用来替代已经过时的optparse模块.argparse模块能够根据程序中的定义从sys.argv中解析 ...

  5. scrapy 登陆知乎

    参考 https://github.com/zkqiang/Zhihu-Login # -*- coding: utf-8 -*- import scrapy import time import r ...

  6. MT【258】椭圆第三定义

    如图,已知椭圆方程为$\dfrac{x^2}{4}+\dfrac{y^2}{3}=1$$A$为椭圆上一点,$AF_1,AF_2$与椭圆交于$B,C$两点,$A_1B,A_2C$交于一点$M$.当$A$ ...

  7. Python将是人工智能时代的最佳编程语言

    Python将是人工智能时代的最佳编程语言 移动互联网取代PC互联网领跑在互联网时代的最前沿,Android和iOS一度成为移动互联网应用平台的两大霸主,成为移动开发者首选的两门技术,HTML5以其跨 ...

  8. 浅析 @PathVariable 和 @RequestParam(转发,非原创)

    首先 上两个地址:地址①http://localhost:8989/SSSP/emps?pageNo=2地址②http://localhost:8989/SSSP/emp/7如果想获取地址①中的 pa ...

  9. N球M盒

    N球,M盒,由于球是否相同,盒是否相同,盒是否可以为空,共2^3=8种: 1.球同,盒同,盒不可以为空Pm(N)--这符号表示部分数为m的N-分拆的个数,m是P的下标,为了好看我将大写的M弄成小写 2 ...

  10. poj3349 Snowflake Snow Snowflakes

    吼哇! 关于开散列哈希: 哈希就是把xxx对应到一个数字的东西,可以理解成一个map<xxx, int>(是不是比喻反了) 我们要设计一个函数,这个函数要确保同一个东西能得到相同的函数值( ...