网络编程
位置:首页>> 网络编程>> Python编程>> python中关于对super()函数疑问解惑

python中关于对super()函数疑问解惑

作者:YZL40514131  发布时间:2022-08-10 04:11:48 

标签:python,super(),函数

案例一:运行下面的代码结果是什么?

class Person:
   def run(self):
       print('studying')

class Person1:
   def run(self):
       print('working')

class Person2:
   def run(self):
       print('playing')

class Person3(Person,Person1,Person2):

def run(self):
       super().run1()

p=Person3()
p.run()

执行结果:

AttributeError: ‘super’ object has no attribute ‘run1’

注意:

1、一个类继承多个类时,如果父类中没有提供该方法,类会通过__mro__属性一直向上搜索,如果直到object还没有搜索到该方法,那么将会引发AttributeError异常

案例二:运行下面的代码结果是什么?

class Person:
   def run(self):
       print('studying')

class Person1:
   def run(self):
       print('working')

class Person2:
   def run(self):
       print('playing')

class Person3(Person,Person1,Person2):

def run(self):
       super(Person1,self).run()

p=Person3()
p.run()

输出结果为:playing;而不是working

注意:

1、super()函数的使用。
使用super()函数时,可以通过super(类名,self)来指定对哪个对象以哪个类为起点向上搜索父类中的方法。
例如:super(Person1,self).run():表示以Person1类为起点,向上搜索self(Person3的对象)的run方法。
Person1向上搜索到了<class &lsquo;main.Person2&rsquo;>,所以才会输出playing

2、print(Person3.mro)的继承顺序为:(<class &lsquo;main.Person3&rsquo;>, <class &lsquo;main.Person&rsquo;>, <class &lsquo;main.Person1&rsquo;>, <class &lsquo;main.Person2&rsquo;>, <class &lsquo;object&rsquo;>)

案例三、更复杂些的继承,和上面的同理

class A:
   def who(self):
       print('A', end='')

class B(A):
   def who(self):
       super(B, self).who()
       print('B', end='')

class C(A):
   def who(self):
       super(C, self).who()
       print('C', end='')

class D(B, C):
   def who(self):
       super(D, self).who()
       print('D', end='')

item = D()
item.who()

print(D.__mro__)

输出结果:

ACBD
(<class &lsquo;main.D&rsquo;>, <class &lsquo;main.B&rsquo;>, <class &lsquo;main.C&rsquo;>, <class &lsquo;main.A&rsquo;>, <class &lsquo;object&rsquo;>)

来源:https://blog.csdn.net/YZL40514131/article/details/125753234

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com