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

时间:2012-11-13 11:31:49

标签: python class methods initialization

如果我在课程中使用__init__而不是init__,则

Some things无效。我很好奇这两者之间的区别是什么。

这是班级的一部分。但它确实无关紧要,因为它适用于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!')

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

如何解释这个?

3 个答案:

答案 0 :(得分:10)

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

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

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

comment you refer to中,作者 在评论中使用__init__,但忘记了跳过前导下划线,并将它们解释为启动粗体文字的代码:

__this is bold__

变为这是粗体。请注意,该评论中的__ 上的__main__结尾{/ 1>也会丢失。

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

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

在这种特定情况下,您根本不需要__init____new__方法 ,因为namedtuple子类Point已经占用关注xyz属性的初始化。通过将__init__重命名为init__,您可以使事情有效,但最终会得到一个您永远不会使用的无意义init__方法。只需将其删除即可。

答案 1 :(得分:3)

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

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

如果init__有效,但__init__没有,那么代码中的某些东西就会被破坏 - 可能是在那个方法中,因为如果它被称为init__,它几​​乎肯定永远不会被调用

答案 2 :(得分:2)

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