在Python中,我可以定义两个类parent
和child
,其中子类继承自父类。然后在child
中,我可以使用self
并可以访问父类(以及继承树中的任何其他父类)中存在的任何方法,只要该名称未在子类中被覆盖类。
这样做有警告吗?推荐的方法是仅使用super()
吗?
代码示例:
class parent:
def add_stars(self, str):
return '***'+str+'***'
class child(parent):
def print_something(self):
print(self.add_stars("Bacon"))
[In Console]
>>> c = child()
>>> c.add_stars("Wow")
'***Wow***'
>>> c.print_something()
'***Bacon***'
编辑:根据注释中的讨论为以后遇到的任何人提供更多的清晰度。让我感到困惑的是,编写上述child
类并获得相同功能的另一种方法是使用super()
:
class child(parent):
def print_something(self):
print(super().add_stars("Bacon"))
只要child
也没有定义称为add_stars
的方法,这就是相同的。如果child
中确实存在该方法,则self
将使用child
类中定义的方法,而super()
将跳过child
类,并且仅看超类。此外,两者将使用相同的方法解析顺序。我想知道的是,像我在示例中一样,在使用self
时是否有任何问题,通常什么时候使用super
等?
下面和评论中对此进行了回答。
答案 0 :(得分:1)
想到super
的最好方法是假装它实际上称为next
,如“方法解析顺序中的下一个”所示。在这种特殊情况下,没有任何区别。使用self.some_method
会尝试解析当前类名称空间中的“ some_method”,而不是找到它,转到MRO中的 next 类,在此处进行检查,找到它,然后它将被解析
如果添加了super,它将跳过当前类的名称空间。
通常,两者并不相等。除非这实际上是您要尝试的操作,否则不要使用super
,即使在等效的情况下也是如此。
答案 1 :(得分:0)
这样做有警告吗?
不,您的代码很好,它可以正确调用父函数。
当前代码不需要super()
。
如果您的类具有构造函数,则子构造函数将必须调用super()
。
PEP8要求您以首字母大写来命名类Parent
和Child
。
您将从pip install flake8
中受益,并遵循运行flake8 *.py
时提供的建议。