Python super()– Python 3 super()

时间:2020-02-23 14:43:34  来源:igfitidea点击:

Python super()函数允许我们显式引用父类。
在继承的情况下,我们要调用超类函数很有用。

Python super

要了解python超级功能,您必须了解Python继承。
在Python继承中,子类从超类继承。

Python super()函数允许我们隐式引用超类。
因此,Python super使我们的任务更加轻松和舒适。
从子类中引用超类时,我们不需要显式地编写超类的名称。
在以下各节中,我们将讨论python超级功能。

Python super函数示例

首先,请看一下我们在Python继承教程中使用的以下代码。
在该示例代码中,超类是" Person",子类是" Student"。
因此,代码如下所示。

class Person:
  # initializing the variables
  name = ""
  age = 0

  # defining constructor
  def __init__(self, person_name, person_age):
      self.name = person_name
      self.age = person_age

      # defining class methods

  def show_name(self):
      print(self.name)

  def show_age(self):
      print(self.age)

# definition of subclass starts here
class Student(Person):
  studentId = ""

  def __init__(self, student_name, student_age, student_id):
      Person.__init__(self, student_name, student_age)
      self.studentId = student_id

  def get_id(self):
      return self.studentId  # returns the value of student id

# end of subclass definition

# Create an object of the superclass
person1 = Person("Richard", 23)
# call member methods of the objects
person1.show_age()
# Create an object of the subclass
student1 = Student("Max", 22, "102")
print(student1.get_id())
student1.show_name()

在上面的示例中,我们将父类函数称为:

Person.__init__(self, student_name, student_age)

我们可以将其替换为python超级函数调用,如下所示。

super().__init__(student_name, student_age)

两种情况下的输出将保持不变.

Python 3 super

请注意,以上语法适用于python 3超级功能。
如果您使用的是python 2.x版本,则略有不同,您将需要进行以下更改:

class Person(object):
...
      super(Student, self).__init__(student_name, student_age)

第一个更改是将"对象"作为Person的基类。
必须在Python 2.x版本中使用超级功能。
否则,您将得到以下错误。

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

超函数本身语法的第二个变化。

如您所见,python 3超级函数易于使用,语法也很简洁。

具有多级继承的Python super函数

如前所述,Python super()函数允许我们隐式引用超类。

但是在多级继承的情况下,它将引用哪个类?好吧,Python super()将始终引用直接超类。

Python super()函数不仅可以引用__init __()函数,还可以调用超类的所有其他函数。
因此,在下面的示例中,我们将看到这一点。

class A:
  def __init__(self):
      print('Initializing: class A')

  def sub_method(self, b):
      print('Printing from class A:', b)

class B(A):
  def __init__(self):
      print('Initializing: class B')
      super().__init__()

  def sub_method(self, b):
      print('Printing from class B:', b)
      super().sub_method(b + 1)

class C(B):
  def __init__(self):
      print('Initializing: class C')
      super().__init__()

  def sub_method(self, b):
      print('Printing from class C:', b)
      super().sub_method(b + 1)

if __name__ == '__main__':
  c = C()
  c.sub_method(1)

让我们看一下上面带有多级继承的python 3 super示例的输出。

Initializing: class C
Initializing: class B
Initializing: class A
Printing from class C: 1
Printing from class B: 2
Printing from class A: 3

因此,从输出中我们可以清楚地看到,首先调用了C类的__init __()函数,然后调用了B类,再调用了A类。
通过调用sub_method()函数发生了类似的情况。

为什么我们需要Python super函数

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