方法中'self'的重新赋值:Python 3.8
Reassignment of 'self' in a method: Python 3.8
在一个class的方法中:
def weight(self, grid):
...
if self.is_vertical:
self = self.T
...
如果条件为真,我想将 self
重新分配给它的转置值。根据 if
语句,我想在稍后的原始或转置条件下的方法中使用 self
。
据我了解,在一个方法中,self
只是一个参数名称,而不是真正的引用或指向class实例的指针,就像在C++或类似语言中一样,所以我可以自由地重新分配它以在方法范围内使用。
我的问题是为什么 PyCharm 的检查信息警告我
...first parameter, such as 'self' or 'cls', is reassigned in a method. In most cases imaginable, there's no point in such reassignment, and it indicates an error.
虽然它工作正常?为什么提示错误?
Why does it indicates an error?
因为没有充分的理由这样做。没有什么会自动使用 self
变量,因此无需重新分配它。如果您需要一个有时引用调用该方法的对象但也可以包含其他值的变量,请为此使用不同的变量。
def mymethod(self):
cur = self
...
cur = cur.T
...
请注意,self
只是该方法中的一个局部变量。重新分配 self
对对象本身或调用该方法的变量没有任何影响。这样做实际上是没有用的,所以它几乎总是表明程序员很困惑。这就是 Pycharm 发出警告的原因。
由于每个人都希望 self
引用调用该方法的对象,因此重新分配它也会让其他程序员感到困惑。在稍后处理方法中的代码时,他们可能没有意识到 self
可能不引用该对象。想象一下试图与说“从现在开始,每当我说 'me' 或 'I',我实际上是指那边那个人的人交谈。”
这只是我们最初采用 self
和 cls
命名约定的另一面。就 Python 而言,您可以为方法的第一个参数使用任何名称。但是我们建议大家使用这些名称,这样我们在阅读彼此的代码时,就不必记住每个方法中的当前对象是什么变量。
Python本身不关心,不会导致那里报错。
在一个class的方法中:
def weight(self, grid):
...
if self.is_vertical:
self = self.T
...
如果条件为真,我想将 self
重新分配给它的转置值。根据 if
语句,我想在稍后的原始或转置条件下的方法中使用 self
。
据我了解,在一个方法中,self
只是一个参数名称,而不是真正的引用或指向class实例的指针,就像在C++或类似语言中一样,所以我可以自由地重新分配它以在方法范围内使用。
我的问题是为什么 PyCharm 的检查信息警告我
...first parameter, such as 'self' or 'cls', is reassigned in a method. In most cases imaginable, there's no point in such reassignment, and it indicates an error.
虽然它工作正常?为什么提示错误?
Why does it indicates an error?
因为没有充分的理由这样做。没有什么会自动使用 self
变量,因此无需重新分配它。如果您需要一个有时引用调用该方法的对象但也可以包含其他值的变量,请为此使用不同的变量。
def mymethod(self):
cur = self
...
cur = cur.T
...
请注意,self
只是该方法中的一个局部变量。重新分配 self
对对象本身或调用该方法的变量没有任何影响。这样做实际上是没有用的,所以它几乎总是表明程序员很困惑。这就是 Pycharm 发出警告的原因。
由于每个人都希望 self
引用调用该方法的对象,因此重新分配它也会让其他程序员感到困惑。在稍后处理方法中的代码时,他们可能没有意识到 self
可能不引用该对象。想象一下试图与说“从现在开始,每当我说 'me' 或 'I',我实际上是指那边那个人的人交谈。”
这只是我们最初采用 self
和 cls
命名约定的另一面。就 Python 而言,您可以为方法的第一个参数使用任何名称。但是我们建议大家使用这些名称,这样我们在阅读彼此的代码时,就不必记住每个方法中的当前对象是什么变量。
Python本身不关心,不会导致那里报错。