1、python中多重继承

除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。

多重继承的继承链就不是一棵树了,它像这样:

  1. class A(object):
  2. def __init__(self, a):
  3. print 'init A...'
  4. self.a = a
  5.  
  6. class B(A):
  7. def __init__(self, a):
  8. super(B, self).__init__(a)
  9. print 'init B...'
  10.  
  11. class C(A):
  12. def __init__(self, a):
  13. super(C, self).__init__(a)
  14. print 'init C...'
  15.  
  16. class D(B, C):
  17. def __init__(self, a):
  18. super(D, self).__init__(a)
  19. print 'init D...'

看下图:

像这样,D 同时继承自 B 和 C,也就是 D 拥有了 A、B、C 的全部功能。多重继承通过 super()调用__init__()方法时,A 虽然被继承了两次,但__init__()只调用一次:

  1. >>> d = D('d')
  2. init A...
  3. init C...
  4. init B...
  5. init D...

多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。

举个例子,Python的网络服务器有TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer,而服务器运行模式有 多进程ForkingMixin 和 多线程ThreadingMixin两种。

要创建多进程模式的 TCPServer:

  1. class MyTCPServer(TCPServer, ForkingMixin)
  2. pass

要创建多线程模式的 UDPServer:

  1. class MyUDPServer(UDPServer, ThreadingMixin):
  2. pass

如果没有多重继承,要实现上述所有可能的组合需要 4x2=8 个子类。

2、python获取多重对象

拿到一个变量,除了用 isinstance() 判断它是否是某种类型的实例外,还有没有别的方法获取到更多的信息呢?

例如,已有定义:

  1. class Person(object):
  2. def __init__(self, name, gender):
  3. self.name = name
  4. self.gender = gender
  5.  
  6. class Student(Person):
  7. def __init__(self, name, gender, score):
  8. super(Student, self).__init__(name, gender)
  9. self.score = score
  10. def whoAmI(self):
  11. return 'I am a Student, my name is %s' % self.name

首先可以用 type() 函数获取变量的类型,它返回一个 Type 对象:

  1. >>> type(123)
  2. <type 'int'>
  3. >>> s = Student('Bob', 'Male', 88)
  4. >>> type(s)
  5. <class '__main__.Student'>

其次,可以用 dir() 函数获取变量的所有属性:

  1. >>> dir(123) # 整数也有很多属性...
  2. ['__abs__', '__add__', '__and__', '__class__', '__cmp__', ...]
  3.  
  4. >>> dir(s)
  5. ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'gender', 'name', 'score', 'whoAmI']
  1. 对于实例变量,dir()返回所有实例属性,包括`__class__`这类有特殊意义的属性。注意到方法`whoAmI`也是 s 的一个属性。

如何去掉`__xxx__`这类的特殊属性,只保留我们自己定义的属性?回顾一下filter()函数的用法。

dir()返回的属性是字符串列表,如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr() 和 setattr( )函数了:

  1. >>> getattr(s, 'name') # 获取name属性
  2. 'Bob'
  3.  
  4. >>> setattr(s, 'name', 'Adam') # 设置新的name属性
  5.  
  6. >>> s.name
  7. 'Adam'
  8.  
  9. >>> getattr(s, 'age') # 获取age属性,但是属性不存在,报错:
  10. Traceback (most recent call last):
  11. File "<stdin>", line 1, in <module>
  12. AttributeError: 'Student' object has no attribute 'age'
  13.  
  14. >>> getattr(s, 'age', 20) # 获取age属性,如果属性不存在,就返回默认值20:
  15. 20

实例:

class Person(object):

def __init__(self, name, gender, **kw):
self.name = name
self.gender = gender
self.__dict__.update(kw)

p = Person('Bob', 'Male', age=18, course='Python')
print (p.age)
print (p.course)

  1. 结果:
  1. 18
  2. Python
  1.  

python中多重继承与获取对象的更多相关文章

  1. python中的类,对象,方法,属性等介绍

    注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  2. Python中的变量引用对象需注意的几点

    Python中的变量引用对象需注意的几点 分类:Python (55)  (0) 普通引用: Python中,变量的作用仅仅是一个标识,只有赋值后才被创建,它可以引用任何类型的对象,而且在引用之前必须 ...

  3. Python中的可迭代对象

      Python中的可迭代对象有:列表.元组.字典.字符串:常结合for循环使用: 判断一个对象是不是可迭代对象: from collections import Iterable isinstanc ...

  4. 第二章python中的一切皆对象

    1.函数和类也是对象,属于python的一等公民 赋值给一个变量 可以添加到集合对象之中 可以作为参数传递给函数 可以当作函数的返回值 def ask(name="ask_wzh" ...

  5. python中的一切皆对象

    python中一切皆对象是这个语言灵活的根本.函数和类也是对象,属于python的一等公民.包括代码包和模块也都是对象.python的面向对象更加彻底. 可以赋值给一个变量可以添加到集合对象中可以作为 ...

  6. Python中:dict(或对象)与json之间的互相转化

    在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作. 在Python中自带json库.通过import json导入. 在json模块有2个方法, loads():将 ...

  7. python 面向对象编程、获取对象信息

    面向对象与面向过程 参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0 ...

  8. 【转】Python中自定义可迭代对象

    python 中内置的可迭代的对象有 list.tuple.set.dict 等,那么我们自己怎么定义一个可迭代的对象呢?先来段代码吧 import re import reprlib RE_WORD ...

  9. Python中的类、对象、继承

    类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...

随机推荐

  1. TortoiseGit上传项目代码到github方法(超简单)

    Github是咱广大开发者用的非常多的项目代码版本管理网站,项目托管可以是私人的(private)或者公开的(public),私人的收费,一个月7美金.咱这里就只说我们个人使用的,一般都是代码对外开放 ...

  2. ORACLE 10g RAC [ CSSCLNT][1]clsssInitNative: connect failed, rc 9

    "[ CSSCLNT][1]clsssInitNative: connect failed, rc 9“是Oracle RAC中经常遇到的问题,主要出现在安装过程和启动过程中.经常在$ORA ...

  3. 剑指offer(13)-栈的压入、弹出序列 九度1366

    题目来自剑指offer系列 九度 1366:http://ac.jobdu.com/problem.php?pid=1367 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列 ...

  4. Spring MVC multipart/form-data Controller 400

    问题很简单是解析器定义问题 SpringMVC默认解析器 <bean id="multipartResolver" class="org.springframewo ...

  5. 转载:resNet论文笔记

    <Deep Residual Learning for Image Recognition>是2016年 kaiming大神CVPR的最佳论文 原文:http://m.blog.csdn. ...

  6. iOS-数组,字典常用的字面量写法

    解决方法: //用字面量创建数组 NSArray *array = @[@"one",@"two"]; //用字面量创建字典 NSDictionary *dic ...

  7. 多线程的设计模式--Future模式,Master-Worker模式,生产者-消费者模式

    代码示例: public interface Data { String getRequest(); } public class FutureData implements Data{ privat ...

  8. JavaServlet实现下载功能

        我们在项目中经常会用到下载功能,所以今天我们先说下下载功能实现的思路,然后通过一个案例代码来具体体现. 1.下载的思路: ①首先要获取我们要操作的文件对象的路径 ②然后使用获取的文件对象路径构 ...

  9. SQL server-自增主键

    1.CREATE   TABLE   表名(     字段名   [int]   IDENTITY   (1,   1)   NOT   NULL   ,    //--(seed = 1,incre ...

  10. 《挑战程序设计竞赛》2.4 数据结构-并查集 POJ1182 2236 1703 AOJ2170

    POJ1182 http://poj.org/problem?id=1182 题目 难得的中文题... 食物链 Time Limit: 1000MS Memory Limit: 10000K Tota ...