实例属性分配的最佳实践是什么?

What is best practice for instance attribute assignment?

鉴于两种使用 类 的方法,我想知道哪种方法更 'standard' 甚至 'better'?

在方法中分配属性

class ChildFrame(Frame):
    def __init__(self, parent, fields=None, **options):
        super().__init__(parent, **options)
        self.fields = fields
        self.field_width()

    def field_width(self):
        self.fw = max(map(len, self.vars))

通过方法分配属性return

class ChildFrame(Frame):
    def __init__(self, parent, fields=None, **options):
        super().__init__(parent, **options)
        self.fields = fields
        self.fw = self.field_width()

    def field_width(self):
        return max(map(len, self.vars))

作为 non-programmer/learner,我想知道您的推理原因,或关于何时使用其中一个或另一个的想法。

执行 __init__ 中的作业。查看您的 class 的人应该能够仅从 __init__ 确定 class 的所有属性实例的集合(在子 classing 情况下,他们有也检查祖先 __init__,但至少他们不必检查 every 祖先的 every 方法),无需搜索它调用的每个方法,以防它们设置其他属性。

即使是惰性定义的属性也应该在 __init__ 中设置为占位符,这既是为了可读性,也是因为它允许 the key-sharing dictionary optimization 工作(显着减少每个实例的内存使用)。