Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否应该使用;“自我”;每次在Python类中更新变量的版本_Python_Python 3.x - Fatal编程技术网

我是否应该使用;“自我”;每次在Python类中更新变量的版本

我是否应该使用;“自我”;每次在Python类中更新变量的版本,python,python-3.x,Python,Python 3.x,这更多的是关于在Python中使用self的最佳实践或最佳风格提示,而不是如何使用它。基本上,我的问题是,我应该尽快使用变量的“self”版本,并且每次之后都使用,还是有时使用“non-self”版本比较合适 下面是一个示例,我会尽快使用变量的“自我”版本: def outside_function1(var1, var2): """Does something""" def outside_function2(var

这更多的是关于在Python中使用
self
的最佳实践或最佳风格提示,而不是如何使用它。基本上,我的问题是,我应该尽快使用变量的“self”版本,并且每次之后都使用,还是有时使用“non-self”版本比较合适

下面是一个示例,我会尽快使用变量的“自我”版本:

def outside_function1(var1, var2):
    """Does something"""
    
def outside_function2(var1, var2):
    """Does something else"""

class MyClass1:
    def __init__(self, a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        
        self.variable_to_calculate = outside_function1(self.a, self.b, self.c) + outside_fuction2(self.a, self.b, self.d)
下面是一个不同的示例,我在同一个init函数中不使用变量的“self”版本:

class MyClass2:
    def __init__(self, a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        
        self.variable_to_calculate = outside_function1(a, b, c) + outside_fuction2(a, b, d)
如果您没有捕捉到它,那么差异就在
self.variable\u to\u calculate
行上

我的想法是,第二个例子,我没有每次都使用
self
,可能更具可读性。它使你不必向右滚动阅读整行内容。我还认为,它可以更快地判断哪些变量被传递到外部函数中。但我也可以看到,使用第一个例子可能会更加清晰


因此,如果这两个例子的作用完全相同,那么其中一个更正确吗?

我个人会尽快使用自变量。原因是可维护性。init函数的参数仅用于向构造函数提供信息

假设将来您不想再直接使用VarB调用外部函数,因为您的类已被修改,VarB现在被拆分为VarE和VarF。在内部,您仍然可以重新创建self.b,并且不必更改任何外部函数调用。

这取决于具体情况

在本例中,您提供给
\uuuu init\uuu
的参数是为构造函数提供的,这可能意味着它们直接与对象本身相关,将来可能会使用。如果是这种情况,那么
self
就很重要并且是必需的


如果它们只是临时的,可能只使用一次或用于设置其他内容,那么您应该完全可以使用非
self
变量。我同意它有助于可读性,如果您没有更永久地存储它们,则无需使用
self

如果您希望该类的其他方法可以轻松访问该变量,请使用self。如果不是这样,你当然可以在你的init方法中使用初始变量。在你的例子中有一个细微的区别。如果其中一个变量是带有getter和setter的属性,
a
self.a
可能不同,或者至少getter代码没有运行。这完全取决于您应该已经知道的类实现,所以没什么大不了的,除非将来它会改变。有些操作无法正常工作<代码>a+=1可能无法更新
self.a
。但除此之外,任何一个选项都可以。另一个约定是,如果变量被设计为类的“私有”变量,或者换句话说,不被类外的任何对象访问,则声明(例如)
a
self.\u a
(前导下划线)。