python中多重继承与获取对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中多重继承与获取对象相关的知识,希望对你有一定的参考价值。

1、python中多重继承

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

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

class A(object):
    def __init__(self, a):
        print init A...
        self.a = a

class B(A):
    def __init__(self, a):
        super(B, self).__init__(a)
        print init B...

class C(A):
    def __init__(self, a):
        super(C, self).__init__(a)
        print init C...

class D(B, C):
    def __init__(self, a):
        super(D, self).__init__(a)
        print init D...

看下图:

技术分享

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

>>> d = D(d)
init A...
init C...
init B...
init D...

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

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

要创建多进程模式的 TCPServer:

class MyTCPServer(TCPServer, ForkingMixin)
    pass

要创建多线程模式的 UDPServer:

class MyUDPServer(UDPServer, ThreadingMixin):
    pass

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

2、python获取多重对象

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

例如,已有定义:

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

class Student(Person):
    def __init__(self, name, gender, score):
        super(Student, self).__init__(name, gender)
        self.score = score
    def whoAmI(self):
        return I am a Student, my name is %s % self.name

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

>>> type(123)
<type int>
>>> s = Student(Bob, Male, 88)
>>> type(s)
<class __main__.Student>

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

>>> dir(123)   # 整数也有很多属性...
[__abs__, __add__, __and__, __class__, __cmp__, ...]

>>> dir(s)
[__class__, __delattr__, __dict__, __doc__, __format__, __getattribute__, __hash__, __init__, __module__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__, __weakref__, gender, name, score, whoAmI]
对于实例变量,dir()返回所有实例属性,包括`__class__`这类有特殊意义的属性。注意到方法`whoAmI`也是 s 的一个属性。

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

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

>>> getattr(s, name)  # 获取name属性
Bob

>>> setattr(s, name, Adam)  # 设置新的name属性

>>> s.name
Adam

>>> getattr(s, age)  # 获取age属性,但是属性不存在,报错:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Student object has no attribute age

>>> getattr(s, age, 20)  # 获取age属性,如果属性不存在,就返回默认值20:
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)

结果:
18
Python





以上是关于python中多重继承与获取对象的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象——多重继承

java 代码片段

Python 的 super() 如何与多重继承一起工作?

[Python]-8-对象与类(下)

Python学习 Day13 Python 面向对象学习2:@property多重继承

请解释python面向对象中的继承