2017-03-07 98 views
1

以下哪种情况是在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 

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

+0

选项1.你应该在'__init__'中声明所有的属性,因为它在哪里有人会寻找它们。 –

+0

OOP中的一般规则(不考虑编程语言)是构造函数就像__init__中的赋值操作符意味着我们应该分配实例变量的值。所以我认为我们应该在__init__中赋值,getter和setter应该与它分开。 –

+2

我为迂腐而道歉,但实例变量没有在Python中声明。当它们首次被分配时,它们[弹出](https://docs.python.org/3.3/tutorial/classes.html#instance-objects)。变量声明存在于C++和Java等语言中,而不是Python中。 –

回答

0

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

当然,您可以稍后在其他方法中根据需要更改它们。

设置类中的构造函数级别变量使得很难理解事物来自哪里。

0

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

0

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

一般来说,你初始化所有的实例变量在__init__-方法,这就是它存在的原因。如果你需要一个getter-/setter使用属性。并使用“最少惊讶”的原则。不要惊讶另一位读者,或者你以后的自己过于聪明和/或复杂的解决方案。 (又名KISS原则)

0

这要看。定义__init__本身内的所有属性通常会使代码更具可读性,但如果类具有很多属性,并且可以轻松将它们划分为逻辑组,那么使用它自己的初始化方法初始化每组属性是有意义的。您可能希望通过给他们一个以单个下划线开始的名称来指示这样的方法是private

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

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

当然,上述内容不适用于@property属性,但即使这些属性通常具有应在__init__中设置的基础“私有”属性。

有关房产的更多信息,请参阅Raymond Hettinger的优秀Descriptor HowTo Guide在Python文档中。


由于juanpa.arrivillaga在问题的评论中提到,我们实际上并不在Python声明变量。这基本上是因为Python数据模型并没有像C和许多其他语言那样的变量。请参阅Other languages have "variables", Python has "names"以获得简洁的解释。另见Facts and myths about Python names and values,这是由SO经验丰富的Ned Batchelder编写的。