1

__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!')

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

这要怎么解释?

4

3 回答 3

10

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

init__只是一个名字很奇怪的类方法。

您需要向我们展示您的代码;如果当您有一个名为的方法时出现问题,那么__init__您在那里犯了一个错误。将其重命名为init__just 意味着它不会被自动调用,因此不会触发您的编码错误。

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

__this is bold__

变得这就是大胆。请注意,该评论____main__ 丢失了尾随。

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

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

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

于 2012-11-13T11:34:46.547 回答
3

init__在 Python 中没有特殊含义。这只是一种方法。

__init__是在对象实例化时自动调用的魔术方法。

如果init__有效但__init__无效,那么您的代码中出现了问题 - 可能在那个方法中,因为如果它被调用init__,它几乎肯定永远不会被调用。

于 2012-11-13T11:34:39.760 回答
2

__init__是一个特殊的方法,它总是在创建类的新对象时调用。只有当您想要定义其他属性或以某种方式更改对象的行为时,它才应该被重载。

于 2012-11-13T11:35:01.977 回答