在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***'
编辑:将根据评论中的讨论为稍后遇到的任何人添加更多清晰度。让我困惑的是,上述CCD_ 6类的另一种写作方式&获得相同的功能是使用super()
:
class child(parent):
def print_something(self):
print(super().add_stars("Bacon"))
只要child
没有定义一个称为add_stars
的方法,这是相同的。如果child
中确实存在该方法,则self
将使用child
类中定义的方法,而super()
将跳过child
类,只查找超类。此外,两者都将使用相同的方法分辨率顺序。我想知道的是,像我在示例中所做的那样使用self
是否有任何问题,您通常什么时候使用super
,等等?
这在下面和评论中得到了回答。
思考super
的最佳方式是假设它实际上被称为next
,如"方法解析顺序中的下一个"。在这种特殊情况中,没有区别。使用self.some_method
将尝试解析当前类命名空间中的"some_method",但找不到它,转到MRO中的下一个类,在那里检查,找到它,它就会被解析。
如果添加了super,它将跳过当前类命名空间。
总的来说,这两者并不等同。您不应该使用super
,除非这确实是您想要做的,即使在等效的情况下也是如此。
这样做需要注意吗?
不,您的代码很好,它正确地调用了父函数。
当前代码不需要super()
。如果你的类有构造函数,那么子构造函数就必须调用super()
。
PEP8要求您将类命名为Parent
和Child
,并使用首字母大写。
您将从pip install flake8
中受益,并在运行flake8 *.py
时遵循它提供的建议。