python类中init__和__init__有什么区别?

1 python methods initialization class

如果我使用__init__而不是init__在课堂上,有些东西不起作用.我很好奇这两者之间的区别是什么.

这是班级的一部分.但它确实无关紧要,因为它适用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!')
Run Code Online (Sandbox Code Playgroud)

我的问题是"如何以两种不同的方式实例化对象?" 这种方式很完美.

怎么解释这个?

Mar*_*ers 10

__init__是用于初始化实例的钩子.(在创建实例时始终会调用它).

init__ 只是一个名字不一的类方法.

你需要告诉我们你的代码; 如果你有一个名为__init__你的方法的东西被打破了你在那里犯了一个错误.将其重命名init__只是意味着它不会被自动调用,因此不会触发编码错误.

你提到评论中,作者确实__init__在他的评论中使用了但是忘了逃避主要的下划线,并且它们被解释为启动粗体文本的代码:

__this is bold__
Run Code Online (Sandbox Code Playgroud)

变得这是大胆的.请注意,尾随____main__ 该注释丢失.

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

有关为什么这是一个问题的详细信息,请参阅使用多个__init__参数Python元组进行子类化 ; 你必须改为创建一个__new__方法.__new__是创建实例的工厂方法,__init__然后初始化数据.但是这不适用于不可变类型,例如namedtupleor tuple,因为你不应该在工厂创建它之后更改实例.

在这种特殊情况下,你不需要一个__init____new__方法因为namedtuplePoint已经采取的初始化的照顾x,yz属性.通过重命名__init__init__你使事情有效,但你最终会得到一个init__你永远不会使用的无意义的方法.只需删除它.