在Python中,如何避免__init__参数与实例变量同名?

2 投票
2 回答
531 浏览
提问于 2025-04-16 16:35

init函数中,初始化实例变量的最佳方法是什么?使用相同的名字两次算不算不好的风格?

class Complex:
     def __init__(self, real, imag):
         self.real = real
         self.imag = imag

我觉得用这种随便的替代名字看起来很邋遢:

class Complex:
     def __init__(self, realpart, imagpart):
         self.r = realpart
         self.i = imagpart

我认为PEP 8风格指南没有特别提到这个问题。它只是说实例变量和方法的名字应该使用小写字母,并用下划线分隔单词。

2 个回答

4

更改底层实例变量的名称有几个原因,但这主要取决于你实际想做什么。一个很好的例子是使用属性。比如,你可以创建一些不会被覆盖的变量,这可能意味着你想把它们存储在其他变量下,像这样:

class MyClass:
  def __init__(self, x, y):
    self._x, self._y = x, y

  @property
  def x(self):
    return self._x

  @x.setter
  def x(self, value):
    print "X is read only."

  @property
  def y(self):
    return self._y

  @y.setter
  def y(self, value):
    self._y = value

这段代码会创建一个类,你可以用两个值来实例化它,分别是x和y,但x是不能被改变的,而y是可以的。

不过一般来说,重复使用同一个实例变量的名称是清晰且合适的。

13

这可能是个人观点,但我认为用同样的名字两次并不是一种糟糕的风格。在Python中,self并不是隐含的,所以self.realreal是完全不同的,没什么危险,比如名字被隐藏的问题,这在其他语言中(比如C++或Java)是比较常见的,那里不太提倡把参数命名成和成员一样。

其实,把参数命名成和成员一样,实际上给了一个很强的暗示,说明这个参数会一一对应到那个成员上。

撰写回答