python中类的多继承中存在的问题

python 中多继承中存在的问题

在学习了python的基本语法及其面向过程编程后,进而学习python的面向对象的编程。如果有java或者c++的一点面向对象编译的底子,学习起来会轻松了不少。

  1. python中多继承的方法

    #coding:utf-8
    #python 3.0
    class A: # 定义了A类
    #代码段
    class B: # 定义了B类
    #代码段
    class C(A,B): # C类继承A类和B类中的数据成员和函数
    #代码段

    EXAMPLE
class Scale:
    def check(self):
        if self.count_person > 500:                          # 判断公司人数是否大于500人
            return "%s is a super company.\n" %self.name
        else:
            return "%s is a small company.\n" %self.name

class Detail:
    def show(self,scale):
        print("There are %s employes working in %s."%(scale,self.count_person))

class Company(Scale,Detail):
    def __init__(self,name,count):                         # 构造函数给数据赋值
        self.name = name
        self.count_person = count

if __name__=="__main__":
    MY_company = Company("Google",75000)
    company_scale = MY_company.check()
    MY_company.show(company_scale)

'''运行结果: 
There are Google is a super company.
employes working in 75000.
'''
  1. 多继承遇到的问题
    当遇到A为基类,B类和C类都继承A类,D类再继承了B类和C类的时候,如果A,B,C,D四个类中出现同样的数据成员或者函数,就会出现问题。
    C++ 通过引入虚函数,虚基类来避免二义性问题所带来的一系列问题。python是如何做的?
#coding:utf-8
#python 3.0
class music:
    def show(self):
        print("music")

class folk(music):
    def show(self):
        print("folk")

class lacation(music):
    def show(self):
        print("lacation")

class Breeze(lacation,folk):
   def illustrate(self):
       folk.show(self)
       lacation.show(self)

breeze = Breeze()
#breeze.show()                       # 运行结果: location
#breeze.illustrate()                 # 运行结果: folk location

python中类的多继承中存在的问题_第1张图片

python 运行后编译器并没有报错,经过查资料翻博客之后发现,python在处理这类问题时使用的是MRO算法。有兴趣的看这个博客 http://python.jobbole.com/85685/
嗯,不懂。 不过不影响。
我们将Breeze类的定义修改一下,class Breeze(folk,loaction), 运行show函数之后发现,输出的是folk,证明python自动将二义性问题处理了。
而派生类继承基类,如果遇见二义性问题,会按继承的先后顺序来处理。就正如locationfolk前,执行location的show函数,反之相同。

你可能感兴趣的:(python)