super()
的简化用法(即不带参数的 super()
)是在 Python 3 中引入的。这个改进是由 PEP 3135 规范化的。
PEP 3135: New Super
PEP 3135 标题为 “New Super”。它介绍了一种新的方式来调用超类的方法,即不再需要显式地传递当前类和实例,只需简单地使用 super()
。
在 Python 2 中,你需要这样写:
class MyClass(BaseClass):
def __init__(self, arg):
super(MyClass, self).__init__(arg)
而在 Python 3 中,通过 PEP 3135 的改进,你可以这样写:
class MyClass(BaseClass):
def __init__(self, arg):
super().__init__(arg)
主要改进点:
- 更简洁:不需要显式地传递当前类和实例。
- 更易读:简化代码,使其更易于阅读和维护。
具体内容:
PEP 3135 的具体说明:
- 它提出了一种更直观的方式来调用父类的方法,减少了书写和维护的复杂性。
- 这个改进仅适用于 Python 3,Python 2 仍然需要使用老式的
super(MyClass, self).__init__()
形式。
代码示例对比:
Python 2 中的用法:
class Parent(object):
def __init__(self):
print("Parent init")
class Child(Parent):
def __init__(self):
super(Child, self).__init__()
print("Child init")
child = Child()
Python 3 中的用法:
class Parent:
def __init__(self):
print("Parent init")
class Child(Parent):
def __init__(self):
super().__init__()
print("Child init")
child = Child()
super().__init__()
的简化用法来自于 PEP 3135。这个改进使得调用超类的初始化方法变得更加简洁和直观,是 Python 3 中的一项重要改进。
代码对比
如果你再看到这段代码应该能看懂super()了吧
第一段代码:
def __init__(self, input_contract=None):
super(ArticleResource, self).__init__()
field_list = Article._meta.fields
self.verbose_name_dict = {}
for i in field_list:
self.verbose_name_dict[i.name] = i.verbose_name
第二段代码:
def __init__(self, input_contract=None):
super().__init__()
field_list = Article._meta.fields
self.verbose_name_dict = {}
for i in field_list:
self.verbose_name_dict[i.name] = i.verbose_name