重复使用参数或使用 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_TOP
和 STORE_FAST
,CPython 中两个最便宜的操作代码),因此您通过任何一种方式获得相同的按摩值,以及来自不合格名称的廉价负载。
当定义一个 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_TOP
和 STORE_FAST
,CPython 中两个最便宜的操作代码),因此您通过任何一种方式获得相同的按摩值,以及来自不合格名称的廉价负载。