在Python中使用“自我”访问父方法的问题

时间:2019-01-04 17:29:12

标签: python python-3.x inheritance

在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***'

编辑:根据注释中的讨论为以后遇到的任何人提供更多的清晰度。让我感到困惑的是,编写上述child类并获得相同功能的另一种方法是使用super()

class child(parent):
    def print_something(self):
        print(super().add_stars("Bacon"))

只要child也没有定义称为add_stars的方法,这就是相同的。如果child中确实存在该方法,则self将使用child类中定义的方法,而super()将跳过child类,并且仅看超类。此外,两者将使用相同的方法解析顺序。我想知道的是,像我在示例中一样,在使用self时是否有任何问题,通常什么时候使用super等?

下面和评论中对此进行了回答。

2 个答案:

答案 0 :(得分:1)

想到super的最好方法是假装它实际上称为next,如“方法解析顺序中的下一个”所示。在这种特殊情况下,没有任何区别。使用self.some_method会尝试解析当前类名称空间中的“ some_method”,而不是找到它,转到MRO中的 next 类,在此处进行检查,找到它,然后它将被解析

如果添加了super,它将跳过当前类的名称空间。

通常,两者并不相等。除非这实际上是您要尝试的操作,否则不要使用super,即使在等效的情况下也是如此。

答案 1 :(得分:0)

  

这样做有警告吗?

不,您的代码很好,它可以正确调用父函数。

当前代码不需要super()。 如果您的类具有构造函数,则子构造函数将必须调用super()

PEP8要求您以首字母大写来命名类ParentChild

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