2016-08-15 33 views
1

根据最佳实践标准,将实例方法中的self本地绑定到另一个变量是否可接受?它派上用场,特别是在测试方法时。我还想知道,如果实例属性在循环中检索,这种方法是否更有效。下面是一个例子实例方法中的“self”与另一个变量的本地绑定是否可以接受?

class C: 
    def __init__(self): 
     self.a = "some attribute" 

    def some_function(self): 
     c = self 
     for _ in range(10): 
      print(c.a) 
+0

我不认为这有害或任何东西,但你为什么要这样做?为什么不在你的循环内部执行'print(self.a)'?你能详细谈谈“它派上用场”吗? – Kevin

+1

为什么测试时这会派上用场?这并不是说你可以接触到这个函数来测试当地人的约束力,所以'self'和'c'在这里并没有什么不同。无论如何,你可以将第一个参数命名为任何你想要的名称,而不必命名为'self'。 –

+1

有些人在阅读代码时看到'c.a'可能会错过'c'只是对实例的引用。 '显式比隐式更好。' –

回答

3

这通常不提供任何好处,它实际上是反直觉的,因为它混淆了读者对你的意图是什么(self可以说是在Python中最知名的名称)。

唯一的上侧做这个(虽然有点不同)是,如果你想通过分配属性的名称(noted as a performance tip in the Python Wiki),以消除对self属性查找的:

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)  

这只会通过在极小的程度上降低执行速度来提供帮助。除此之外,你真的没有像这样重命名self的好处。

+0

最近我有一些代码,在接下来的几行中我不得不调用函数'self.data_grabber.buffer_cleave_left'大约六次,所以我只是重命名了它:'n = self.data_grabber.buffer_cleave_left'。 – DJX

+0

@DJX消除“6 * 3”查找通常不会产生很大的差异。在你的情况下,如果你用一个较短的名称替换一个长名字,你可能会让代码更具可读性。 –

+1

尽管如此,你必须知道“a”是什么,如果'self.a'是一个具有副作用的属性(可能是一个坏主意,但可能),查看它可能与查看它10次非常不同。 – chepner

相关问题