Python “的本地约束”;“自我”;实例方法中的另一个变量是否可以接受?

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

根据最佳实践标准,将实例方法中的self局部绑定到另一个变量是否可以接受?它很方便,尤其是在测试方法时。我还想知道,如果在循环中检索实例属性,这种方法是否更有效。这里有一个例子

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)