在 Python 中使用 "self" 访问父方法的问题



在Python中,我可以定义两个类parentchild,其中子类从父类继承。然后,在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要求您将类命名为ParentChild,并使用首字母大写。

您将从pip install flake8中受益,并在运行flake8 *.py时遵循它提供的建议。

最新更新