Skip to main content
 首页 » 编程设计

python之python类中的init__和__init__有什么区别

2025年05月04日13lonelyxmas

Some things如果我在类中使用 __init__ 而不是 init__ 则不起作用。我只是好奇这两者之间的区别是什么。

这是类(class)的一部分。但这并不重要,因为它适用于 init__ 而不适用于 __init__。我明白这是一个打字错误,那么这意味着我实际上可以用任何方式调用它。

class Point(namedtuple('Point', 'x, y, z')): 
  'class of a point as a tuple array' 
  __slots__ = () # prevent creation of instance dictionaries to save memory 
 
  def init__(self, x, y, z): 
    self.x = x 
    self.y = y 
    self.z = z 
 
  def __del__(self): 
    'delete the Point' 
 
  def __repr__(self): 
    'Return a nicely formatted representation string' 
    return '[%r, %r, %r]' % (self) 
 
  def __str__(self): 
    'printing format' 
    return '%s[%r, %r, %r]' % (self.__class__.__name__, 
                               self.x, self.y, self.z) 
 
  def __add__(self, other): 
    return Point(self.x + other.x, self.y + other.y, self.z + other.z) 
 
  def __sub__(self, other): 
    return Point(self.x - other.x, self.y - other.y, self.z - other.z) 
 
  def __mul__(self, scal): 
    'multiplication ny scalar' 
    return Point(self.x * scal, self.y * scal, self.z * scal) 
 
  def __div__(self, scal): 
    'division ny scalar' 
    if scal != 0.0: 
        return Point(self.x / scal, self.y / scal, self.z / scal) 
    else: 
        sys.exit('Division by zero!') 

我的问题是“如何以两种不同的方式实例化一个对象?”这样它就完美地工作了。

这个怎么解释?

请您参考如下方法:

__init__是用于初始化您的实例的 Hook 。 (它总是在您创建实例时调用)。

init__ 只是一个名称古怪的类方法。

您需要向我们展示您的代码;如果当你有一个名为 __init__ 的方法时有什么东西坏了,你在那里犯了一个错误。将它重命名为 init__ 只是意味着它不会被自动调用,因此不会触发您的编码错误。

在comment you refer to ,作者确实在他的评论中使用了 __init__ 但忘记转义前导下划线,它们被解释为开始粗体文本的代码:

__this is bold__ 

变成这是粗体。请注意,__main__ also 上的尾随 __ 在该注释中丢失了。

在更新后的代码中,您试图覆盖元组(子类)的 __init__ 方法,这是一种特殊情况。通过将 __init__ 方法重命名为 init__,您创建了一个不同的方法并且根本没有遇到这个常见问题。

参见 Subclassing Python tuple with multiple __init__ arguments有关为什么这是一个问题的更多详细信息;您必须改为创建一个 __new__ 方法。 __new__是创建实例的工厂方法,__init__ 然后初始化数据。但这不适用于不可变类型,例如 namedtuple 或 tuple,因为您不应该在工厂创建实例后更改它。

在这种特定情况下,您根本不需要__init__ 或__new__ 方法,因为namedtuple 子类 Point 已经负责了 x、y 和 z 属性的初始化。通过将 __init__ 重命名为 init__,您可以使事情正常进行,但最终会得到一个您永远不会使用的毫无意义的 init__ 方法。只需删除它即可。