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__ 方法。只需删除它即可。
