代码之家  ›  专栏  ›  技术社区  ›  Lovethenakedgun

在python中使用“self”访问父方法的问题

  •  1
  • Lovethenakedgun  · 技术社区  · 6 年前

    在python中,我可以定义两个类 parent 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***'
    

    编辑: 将根据评论中的讨论为以后遇到的任何人添加更清晰的内容。让我困惑的是,这是另一种写作方式 小孩 获取相同功能的类将使用 超级() :

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

    这是一样的,只要 小孩 不定义名为 add_stars 也。如果该方法确实存在于 小孩 然后 自己 而是使用 小孩 类,而 超级() 将跳过 小孩 类,只在超类中查找。此外,两种方法都将使用相同的方法分辨率顺序。我想知道的是,使用 自己 正如我在示例中所做的,您通常在什么时候使用 super 代替,等等?

    这在下面和评论中得到了回答。

    2 回复  |  直到 6 年前
        1
  •  1
  •   juanpa.arrivillaga    6 年前

    最好的思考方式 super 假装它是真的 next ,如“方法分辨率顺序中的下一步”。在这 特殊情况 没有区别。使用 self.some_method 将尝试解析当前类命名空间中的“some\u method”,但找不到它,请转到 下一个 在MRO中分类,检查那里,找到它,它将被解决。

    如果你加了super, 箕斗 当前类命名空间。

    一般来说,这两个词是等价的,这是不正确的。你不应该使用 超级的 除非这实际上是你想要做的,即使在这种情况下它是等效的。

        2
  •  0
  •   J_H    6 年前

    这样做有什么注意事项吗?

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

    当前代码不需要 super() . 如果类有构造函数,则子构造函数必须调用 超级() .

    PEP8 要求你说出课程名称 Parent Child ,初始资本。

    你会从中受益 pip install flake8 当你跑步时,遵循它提供的建议 flake8 *.py .