重复使用参数或使用 self

Re-use argument or use self

当定义一个 class 并且你需要使用一个参数两次时,是继续使用参数还是在创建后立即使用 self 版本更好?

class Example:
    def __init__(self, name):
        self.name = name
        self.name_upper = name.upper()

class Example:
    def __init__(self, name):
        self.name = name
        self.name_upper = self.name.upper()

那么列表呢?

class Example:
    def __init__(self, name):
        self.name = name
        self.name_list = [name,name,name]
class Example:
    def __init__(self, name):
        self.name = name
        self.name_list = [self.name,self.name,self.name]

这是一个范围问题。在下面的示例中,变量 'name' 仅在方法 '__init__' 中可见,而变量 'self.name_list' 可以在 class.[=14= 中的任何方法中使用]

class Example :
    def __init__ (self, name) :
        self.name_list = [name] * 3

    def show_variables (self) :
        print (self.name_list)
        print (name)      # gives 'name' is not defined error

this = Example ('This example')
this.show_variables ()

TL;DR:在您描述的具体情况下,这无关紧要。这是速度和安全性之间的一个非常小的权衡,以应对未来的变化,但没有正确的答案。

如果在将参数存储到属性之前没有对其进行修改,那么它并不重要。使用非限定名称会稍微快一些(CPython 上的 self.name 涉及一个便宜的 LOAD_FAST 和一个明显更昂贵的 LOAD_ATTR,如果从绝对意义上讲仍然便宜的话;普通的 name 对于一个参数只是一个 LOAD_FAST),所以如果你是 100% 确定你永远不会在存储之前修改参数(例如没有 self.name = int(name)) , 尽可能避免 self 会加快初始化速度。

虽然如此,但很少有人能确定,所以使用 self.name 更安全。即使在按摩参数时,您也可以通过执行以下操作来拆分差异:

self.name = name = int(name)

存储回属性和本地(通过 DUP_TOPSTORE_FAST,CPython 中两个最便宜的操作代码),因此您通过任何一种方式获得相同的按摩值,以及来自不合格名称的廉价负载。