但我们知道,Python是一门支持多继续的面向工具编程措辞,如果子类继续的多个父类中包含同名的类实例方法,则子类工具在调用该方法时,会优先选择排在最前面的父类中的实例方法。
显然,布局方法也是如此。

举个例子:

class People: def __init__(self,name): self.name = name def say(self): print("我是人,名字为:",self.name)class Animal: def __init__(self,food): self.food = food def display(self): print("我是动物,我吃",self.food)#People中的 name 属性和 say() 会遮蔽 Animal 类中的class Person(People, Animal): passper = Person("zhangsan")per.say()#per.display()12345678910111213141516复制代码类型:[python]

运行结果,结果为:

php父类调用Python super函数挪用父类的结构办法 Java

我是人,名字为: zhangsan1复制代码类型:[python]

上面程序中,Person类同时继续People和Animal,个中People在前。
这意味着,在创建per工具时,其将会调用从People继续来的布局函数。
因此我们看到,上面程序在创建per工具的同时,还要给name属性进行赋值。

但如果去掉末了一行的注释,运行此行代码,Python阐明器会报如下缺点:

Traceback (most recent call last): File "D:\python3.6\Demo.py", line 18, in <module> per.display() File "D:\python3.6\Demo.py", line 11, in display print("我是动物,我吃",self.food)AttributeError: 'Person' object has no attribute 'food'123456复制代码类型:[java]

这是由于,从Animal类中继续的display()方法中,须要用到food属性的值,但由于People类的布局方法“遮蔽”了Animal类的布局方法,使得在创建per工具时,Animal类的布局方法未得到实行,以是程序出错。

反过来也是如此,如果将第13行代码改为如下形式:

class Person(Animal, People)1复制代码类型:[java]

则在创建per工具时,会给food属性传值。
这意味着,per.display()能顺序实行,但per.say()将会报错。

针对这种情形,精确的做法是定义Person类自己的布局方法(等同于重写第一个直接父类的布局方法)。
但须要把稳,如果在子类中定义布局方法,则必须在该方法中调用父类的布局方法。

在子类中的布局方法中,调用父类布局方法的办法有2种,分别是:

1、类可以看做一个独立空间,在类的外部调用个中的实例方法,可以向调用普通函数那样,只不过须要额外备注类名(此办法又称为未绑定方法);

2、利用super()函数。
但如果涉及多继续,该函数只能调用第一个直接父类的布局方法。

也便是说,涉及到多继续时,在子类布局函数中,调用第一个父类布局方法的办法有以上2种,而调用其它父类布局方法的办法只能利用未绑定方法。

值得一提的是,Python2.x中,super()函数的利用语法格式如下:

super(Class, obj).__init__(self,...)1复制代码类型:[python]

个中,Class值得是子类的类名,obj常日指的便是self。

但在Python3.x中,super()函数有一种更大略的语法格式,推举大家利用这种格式:

super().__init__(self,...)1复制代码类型:[python]

在节制super()函数用法的根本上,我们可以考试测验修正上面的程序:

class People: def __init__(self,name): self.name = name def say(self): print("我是人,名字为:",self.name)class Animal: def __init__(self,food): self.food = food def display(self): print("我是动物,我吃",self.food)class Person(People, Animal): #自定义布局方法 def __init__(self,name,food): #调用 People 类的布局方法 super().__init__(name) #super(Person,self).__init__(name) #实行效果和上一行相同 #People.__init__(self,name)#利用未绑定方法调用 People 类布局方法 #调用其它父类的布局方法,需手动给 self 传值 Animal.__init__(self,food) per = Person("zhangsan","熟食")per.say()per.display()12345678910111213141516171819202122复制代码类型:[python]

运行结果为:

我是人,名字为: zhangsan我是动物,我吃 熟食12复制代码类型:[python]

可以看到,Person类自定义的布局方法中,调用People类布局方法,可以利用super()函数,也可以利用未绑定方法。
但是调用Animal类的布局方法,只能利用未绑定方法。

开课吧广场-人才学习互换平台