【问题标题】:In Python, what's the best way to avoid using the same name for a __init__ argument and an instance variable?在 Python 中,避免对 __init__ 参数和实例变量使用相同名称的最佳方法是什么?
【发布时间】:2011-04-28 15:48:04
【问题描述】:

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 风格指南中没有解决这个问题。它只是说实例变量和方法名称应该是小写的,用下划线分隔单词。

【问题讨论】:

  • 你认为哪一个可以提高可读性?
  • 在这个例子中,第二个是最易读的,但在一个更复杂的例子中,有更多不同类型的参数,这两个例子似乎都不能很好地工作。

标签: python coding-style naming-conventions


【解决方案1】:

这可能是主观的,但我不会认为两次使用相同的名字是不好的风格。由于self 在 Python 中不是隐式的,self.realreal 是完全不同的,并且没有名称隐藏等的危险,就像您在其他语言中所经历的那样(即 C++/Java,其中成员等命名参数是有点皱眉)。

实际上,为参数赋予与成员相同的名称会给出强烈的语义暗示,即参数将一一映射到成员。

【讨论】:

  • +1:如果两个名称相同,它会简化读取代码。
  • 如果你习惯了其他带有隐式 self/this 的语言,重复的名字可能看起来是个坏主意,但是由于 python 强制你使用 self,它真的只是比如给你的字段名添加前缀(在 C++ 中你可能使用了 m_Real 或 _real 之类的东西)。
【解决方案2】:

更改底层实例变量的名称有几个原因,但这在很大程度上取决于您实际需要做什么。一个很好的例子是使用属性。例如,您可以创建不会被覆盖的变量,这可能意味着您希望将它们存储在其他变量下,如下所示:

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 可以。

不过,一般来说,为实例变量重用同名是明确且适当的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2023-04-01
    • 2014-11-18
    • 1970-01-01
    • 2020-01-23
    • 2019-08-23
    相关资源
    最近更新 更多