__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!')
我的问题是“如何以两种不同的方式实例化对象?”这种方式很完美。
如何解释这个?
答案 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__
然后初始化数据。但这不适用于namedtuple
或tuple
等不可变类型,因为在工厂创建实例后,您不应该更改实例。
在这种特定情况下,您根本不需要__init__
或__new__
方法 ,因为namedtuple
子类Point
已经占用关注x
,y
和z
属性的初始化。通过将__init__
重命名为init__
,您可以使事情有效,但最终会得到一个您永远不会使用的无意义init__
方法。只需将其删除即可。
答案 1 :(得分:3)
init__
在Python中没有特殊含义。这只是一种方法。
__init__
是在对象实例化时自动调用的神奇方法。
如果init__
有效,但__init__
没有,那么代码中的某些东西就会被破坏 - 可能是在那个方法中,因为如果它被称为init__
,它几乎肯定永远不会被调用
答案 2 :(得分:2)
__init__
是一种特殊方法,在创建类的新对象时始终会调用该方法。当您想要定义其他属性或以某种方式更改对象的行为时,它应该只是重载。