【问题标题】:Is it bad form to call an instance method from within that instance's __init__ method?从实例的 __init__ 方法中调用实例方法是不是不好的形式?
【发布时间】:2013-02-11 15:27:14
【问题描述】:

我正在构建一个具有属性的对象,该属性的值是在实例化时随机生成的。该属性将不时被分配一个新值(也是随机的),因此我正在定义一种方法来执行此操作。通过在__init__ 中调用该方法来初始化属性是不是很糟糕?这很容易避免——我只需要复制少量代码——但调用该方法似乎更优雅。这是一个例子:

import random

class Robot(object):
    def __init__(self):
        self.setDirection()

    def setDirection(self):
        self.direction = random.random() * 360

【问题讨论】:

  • 不,这样做还不错。方法 (setDirection) 是一个帮助类的函数,如果它需要帮助类在初始化或任何其他阶段实现其目的。
  • 由于事物的初始化顺序与您预期的不同,因此可能会出现错误,但只要辅助方法不依赖于对象的任何状态,您就可以了。
  • (上面的一个例子是如果你从超类的__init__方法调用子类中覆盖的方法。由于通常首先调用超类构造函数,如果覆盖假定子类构造函数中的代码已经运行,您遇到了一个难以解决的问题。尽管在 Python 中比在 Java/C# 中要少,因为您可以随时调用 super().__init__()。)
  • @millimoose 这是一个好点,我不确定是否要这样做,因为我习惯于直接在__init__ 中查看定义/初始化的属性。

标签: python methods initialization


【解决方案1】:

可以在__init__ 中调用实例方法,但要小心它们可能会在子类中被覆盖:

class A(object):

    def __init__(self):
        self.greet()

    def greet(self):
        print('Hello from A')


class B(A):

    def __init__(self, name):
        super(B, self).__init__()
        self.name = name

    def greet(self):
        print('Hello from B', self.name)

现在如果 B 被实例化,A.__init__ 在满足其先决条件之前调用B.greetself.name 未定义)。

【讨论】:

    【解决方案2】:

    __init__ 中调用其他实例方法并没有错。


    请注意,在 python 中,实例方法class methods之间存在区别。我想不出在__init__ 中使用类方法 的充分理由——这并不是说不存在充分的理由,但这种情况可能非常罕见.

    【讨论】:

    • 感谢您的帮助!我将编辑标题以反映这一点(希望我做对了)。
    猜你喜欢
    • 2012-07-23
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多