实例属性分配的最佳实践是什么?
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 工作(显着减少每个实例的内存使用)。
鉴于两种使用 类 的方法,我想知道哪种方法更 '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 工作(显着减少每个实例的内存使用)。