6

中的每个对象sympy都是Basic类的子类,它们都使用__new__without __init__,而且大多数情况下是这样的

def __new__(cls, some, parameter, **others):
    obj = parentclass.__new__(cls, **others)
    obj.some = some
    obj.parameter = parameter
    return obj

__init__使用like有什么区别

def __init__(self, some, parameter, **others):
    parentclass.__init__(self, **others)  # or super().__init__(...)
    self.some = some
    self.parameter = parameter

?

4

1 回答 1

3

看看数字 。他们希望对象的类是灵活的。Number(...) => Int/Float/...这是无法实现的__init__

此外,__init__将获得的参数,__new__但您不需要原始参数,请参阅matexpr.py或者您需要它们适应__new__已经做过的事情(例如for__reduce__)。

大多数对象定义自己的__slots__,因此可以分配给它们的固定属性。分配可以在__new__和中完成__init__。我认为不需要打开一个新__init__的来设置它们并且不执行其他操作 - 正如 Martijn Pieters 和 user4815162342 [来源]指出的对象是不可变的。

如果您更改类,有时__init__会调用不,一次或两次:

class X(object):
    def __new__(self): # sorry but self is the class I apologize!
        obj = object.__new__(Y)
        return obj
    def __init__(self):
        print 1

>>> class Y(object):
    def __init__(self):
        print 2
>>> X() # no __init__ call, limiting you to stay in the class hierarchy
<__main__.Y object at 0x7f287e769350>
>>> class Y(X):
    def __init__(self):
        print 2


>>> X() # one __init__ call
2
<__main__.Y object at 0x7f287e7693d0>
>>> class X(object):
    def __new__(self):
        obj = Y()
        return obj
    def __init__(self):
        print 1


>>> class Y(X):
    def __new__(self):
        return object.__new__(self)
    def __init__(self):
        print 2


>>> X() # __init__ called twice, structure copied from number.py
2
2
<__main__.Y object at 0x7f287e7692d0>

如果我错了,请纠正我。我不认为这个答案是完整的,但这些是我发现值得激励不要使用的复杂性,__init__除了 Martijn Pieters 和 user4815162342 提到的对象应该是不可变的[来源]

等待 2 票否决以删除答案。

于 2013-04-11T09:52:55.550 回答