python super

python super() 函数显式的引用父类, 它用来在子类中调用我们继承的超类的方法

要了解python super(),您必须了解Python继承。 在Python继承中,子类继承自超类。

super() 允许我们隐式引用超类。因此,Python super使我们的任务更简单、更舒适。在从子类引用超类时,我们不需要显式地写超类的名称。在接下来的几节中,我们将讨论python超函数。

example

  1. class Person:
  2. # initializing the variables
  3. name = ""
  4. age = 0
  5. # defining constructor
  6. def __init__(self, person_name, person_age):
  7. self.name = person_name
  8. self.age = person_age
  9. # defining class methods
  10. def show_name(self):
  11. print(self.name)
  12. def show_age(self):
  13. print(self.age)
  14. # definition of subclass starts here
  15. class Student(Person):
  16. studentId = ""
  17. def __init__(self, student_name, student_age, student_id):
  18. Person.__init__(self, student_name, student_age)
  19. self.studentId = student_id
  20. def get_id(self):
  21. return self.studentId # returns the value of student id
  22. # end of subclass definition
  23. # Create an object of the superclass
  24. person1 = Person("Richard", 23)
  25. # call member methods of the objects
  26. person1.show_age()
  27. # Create an object of the subclass
  28. student1 = Student("Max", 22, "102")
  29. print(student1.get_id())
  30. student1.show_name()
  31. '''
  32. D:\projects\pythoncode\pythonparallel
  33. (pythonparallel-jU7W1wcf) λ python pysuperdemo.py
  34. 23
  35. 102
  36. Max
  37. D:\projects\pythoncode\pythonparallel
  38. '''

上面的例子中, 我们调用父类的方法

  1. Person.__init__(self, student_name, student_age)

我们可以这样替换

  1. # definition of subclass starts here
  2. class Student(Person):
  3. studentId = ""
  4. def __init__(self, student_name, student_age, student_id):
  5. # Person.__init__(self, student_name, student_age)
  6. super().__init__(student_name, student_age)
  7. self.studentId = student_id
  8. def get_id(self):
  9. return self.studentId

python3 super

注意,上面的语法是针对python3 super()的。如果你用的是python2.x版本,然后它略有不同,你将不得不做以下更改

  1. class Person(object): # 2.x 必须继承自 object
  2. ...
  3. super(Studnet, self).__init__(studnet_name, student_age)

2.x 版本的object 是必须的,否则会抛出以下错误

  1. Traceback (most recent call last):
  2. File "super_example.py", line 40, in <module>
  3. student1 = Student("Max", 22, "102")
  4. File "super_example.py", line 25, in __init__
  5. super(Student, self).__init__(student_name, student_age)
  6. TypeError: must be type, not classobj

第二个变化是,super语法的变化,python3 super 语法更加简洁。

多继承中的 super

如前所述,super()允许我们隐匿引用超类。但是在多继承中,它将引用哪个类呢?super() 总是引用直接的超类。它不仅可以引用 __init__() ,还可以引用超类的所有其他函数。

  1. class A:
  2. def __init__(self):
  3. print('Initializing: class A')
  4. def sub_method(self, b):
  5. print('Printing from class A:', b)
  6. class B(A):
  7. def __init__(self):
  8. print('Initializing: class B')
  9. super().__init__()
  10. def sub_method(self, b):
  11. print('Printing from class B:', b)
  12. super().sub_method(b + 1)
  13. class C(B):
  14. def __init__(self):
  15. print('Initializing: class C')
  16. super().__init__()
  17. def sub_method(self, b):
  18. print('Printing from class C:', b)
  19. super().sub_method(b + 1)
  20. if __name__ == '__main__':
  21. c = C()
  22. c.sub_method(1)
  23. '''
  24. D:\projects\pythoncode\pythonparallel
  25. (pythonparallel-jU7W1wcf) λ python pysuperdemo.py
  26. Initializing: class C
  27. Initializing: class B
  28. Initializing: class A
  29. Printing from class C: 1
  30. Printing from class B: 2
  31. Printing from class A: 3
  32. D:\projects\pythoncode\pythonparallel
  33. '''

因此,从输出中我们可以清楚地看到,C类的 __init__() 函数首先被调用,然后是B类,然后是a类。

功能

我们为什么需要 super()
如果您以前有过Java语言的经验,那么您应该知道基类也是由超级对象调用的。 因此,这个概念实际上对编码人员有用。 但是,Python还为程序员保留了使用超类名称来引用它们的功能。 而且,如果你的程序包含多级继承,那么这个super()函数对你有帮助。

参考

https://www.journaldev.com/15911/python-super