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__方法都因为namedtuple子Point已经采取的初始化的照顾x,y和z属性.通过重命名__init__给init__你使事情有效,但你最终会得到一个init__你永远不会使用的无意义的方法.只需删除它.