以下哪种情况是在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
这纯粹是要了解其他开发人员在审查和扩展代码时希望看到的最佳实践方法。
这显然不是精确的科学,但是在构造函数中设置所有属性通常更有意义,以便您可以跟进它们。
当然,您可以在其他方法中根据需要更改它们。
设置构造级级别变量班上到处都是很难理解事物的来源。
选项1是在Python中声明实例变量的最佳实践。实例变量是用于实际上是实例一部分的数据,因此如果您在构造函数中定义。
您的选项2基本上是一个setter-/getter-paradigm。Python使用这些用例使用属性。对于一个类似的问题,有一个很好的SO-ASWER。
通常,您在__init__
-Method中初始化所有实例变量,这就是其存在的原因。如果您需要getter-/setter使用属性。并使用"最小忍受"原则。不要让另一个读者或以后的自我感到惊讶,因为它过于聪明和/或复杂的解决方案。(又名亲吻原则)
它取决于。定义__init__
本身内部的所有属性通常会使代码更具可读性,但是如果类具有很多属性,并且您可以轻松地将它们分为逻辑组,那么以自己的初始化方法初始化每个属性的初始化是有意义的。您可能希望通过给它们以单个下划线开始的名称来表明这些方法是私人的。
请注意,如果类是从一个或多个其他类派生(除object
),则您必须调用super.__init__
才能初始化从父类中继承的属性。
最重要的是,在__init__
完成执行时,所有实例属性都应存在。如果无法为__init__
中的某些属性设置适当的值,则应将其设置为适当的默认值,例如一个空字符串,列表等,None
或像object()
这样的前哨值。
当然,以上不适用于@property
属性,但即使这些属性通常都具有基本的"私有"属性,该属性应在__init__
中设置。
有关属性的更多信息,请参阅Raymond Hettinger的出色描述符Howto指南。
正如Juanpa.Arrivillaga在问题评论中提到的那样,我们实际上并没有在Python中声明变量。这基本上是因为Python数据模型实际上并没有像C和许多其他语言这样的变量。有关简洁的解释,请使用漂亮的图表,请查看其他语言具有"变量",Python具有"名称"。另请参见有关Python名称和价值观的事实和神话,这些名称和价值是由资深的Ned Batchelder撰写的。