在哪里声明对象变量

时间:2017-03-07 09:18:56

标签: python oop

以下哪种情况是在python中声明实例变量的最佳实践方法。是否有典型的偏好,这有什么理由?

选项1 - 在__init __

中声明
class MyObject:

    def __init__(self, arg):
        self.variable_1 = self.method_1(arg)

    def method_1(self, arg):
        return(arg)

选项2 - 以其他方式声明

class MyObject:

    def __init__(self, arg):
        self.method_1(arg)

    def method_1(self, arg):
        self.variable_1 = arg

这纯粹是为了理解是否存在其他开发人员在审阅和扩展代码时更愿意看到的最佳实践方法。

4 个答案:

答案 0 :(得分:0)

这显然不是精确的科学,但通常在构造函数中设置所有属性(如果可能)更有意义,以便您可以跟进它们。

当然,您可以在以后的其他方法中更改它们。

在类中的任何地方设置构造函数级变量使得很难理解事物的来源。

答案 1 :(得分:0)

选项1是在Python中声明实例变量的最佳实践。 实例变量用于实际上是实例的一部分的数据,因此如果在构造函数中定义它会更好。

答案 2 :(得分:0)

您的选项2基本上是一个Setter- / Getter-Paradigm。 Python使用这些用例的属性。对于类似的问题,SO-answer很不错。

通常,您在__init__ - 方法中初始化所有实例变量,这是其存在的原因。如果您需要getter / setter使用属性。使用"最少惊讶"原理。不要让其他读者感到惊讶,或者让你的后来自己过于聪明和/或复杂的解决方案。 (又名KISS原则)

答案 3 :(得分:0)

这取决于。定义__init__内部的所有属性通常会使代码更具可读性,但是如果类具有很多属性并且您可以轻松地将它们划分为逻辑组,那么在自己的初始化中初始化每组属性是有意义的。方法。您可能希望通过给出一个以单个下划线开头的名称来表明此类方法为private

请注意,如果该类派生自一个或多个其他类(除了object),则必须调用super.__init__来初始化从父类继承的属性。< / p>

底线是所有实例属性应该在__init__完成执行时存在。如果无法为__init__中的某个属性设置正确的值,则应将其设置为适当的默认值,例如空字符串,列表等,None或哨兵价值如object()

当然,上述内容并不适用于@property属性,但即使这些属性通常也会有一个基础&#34;私有&#34;应在__init__中设置的属性。

有关属性的详细信息,请参阅Python文档中的Raymond Hettinger优秀Descriptor HowTo Guide

正如juanpa.arrivillaga在问题评论中提到的,我们实际上并没有在Python中声明变量。这主要是因为Python数据模型确实没有像C这样的变量和许多其他语言。有关精美图表的简洁说明,请参阅Other languages have "variables", Python has "names"。另请参阅由{资深人士Ned Batchelder撰写的Facts and myths about Python names and values