Python “的本地约束”;“自我”;实例方法中的另一个变量是否可以接受?
根据最佳实践标准,将实例方法中的self局部绑定到另一个变量是否可以接受?它很方便,尤其是在测试方法时。我还想知道,如果在循环中检索实例属性,这种方法是否更有效。这里有一个例子Python “的本地约束”;“自我”;实例方法中的另一个变量是否可以接受?,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,根据最佳实践标准,将实例方法中的self局部绑定到另一个变量是否可以接受?它很方便,尤其是在测试方法时。我还想知道,如果在循环中检索实例属性,这种方法是否更有效。这里有一个例子 class C: def __init__(self): self.a = "some attribute" def some_function(self): c = self for _ in range(10): print(c
class C:
def __init__(self):
self.a = "some attribute"
def some_function(self):
c = self
for _ in range(10):
print(c.a)
这通常不会带来任何好处,实际上是违反直觉的,因为它会混淆读者的意图(
self
可以说是Python中最容易识别的名称)
这样做的唯一好处(尽管有点不同)是,如果要通过将属性指定给名称()来消除对self
的属性查找:
这只会在极小程度上降低执行速度,从而起到一点作用。除此之外,像这样重命名
self
真的没有什么好处。我不认为这是有害的,但你为什么要这么做?为什么不在循环中打印(self.a)?你能更详细地介绍一下“它很有用”吗?为什么在测试时它会有用呢?这并不是说你可以使用这个函数来测试本地人绑定到什么,所以self
与c
在这里没有一点区别。您可以随意命名第一个参数,它不必命名为self
。有些人在阅读代码时看到c.a
,可能很容易忽略c
只是引用实例<代码>显式比隐式好。谢谢您的评论。我实际上不知道实例方法的第一个参数不需要名称为“self”最近我有一些代码,我必须在接下来的几行中调用函数self.data\u grabber.buffer\u cleave\u left
大约六次,所以我只是将其重命名:n=self.data\u grabber.buffer\u cleave\u left
@DJX消除6*3
查找通常不会有多大区别。在你的例子中,好处是如果你用一个较短的名字替换一个较长的名字,你可能会使代码更可读;如果self.a
是一个有副作用的属性(可能是个坏主意,但也有可能),查找一次可能与查找10次大不相同。@chepner当然,这确实是一个愚蠢的“优化”,原因很多。Python的速度问题不能通过简单地消除点来解决。如果有人想在Python中进行优化,他应该看看为解决这个问题而创建的几十种工具。
def some_function(self):
# we assign 'self.a' to 'a'
# to avoid looking for 'a' in 'self' for every iteration
a = self.a
for _ in range(10):
print(a)