Python 为什么sympy会覆盖“新的”而不是“初始化”?

Python 为什么sympy会覆盖“新的”而不是“初始化”?,python,Python,中的每个对象都是类的一个子类,它们都使用\uuuuu new\uuuuuu而不使用\uuuuuuu init\uuuuuu,大多数情况下 def __new__(cls, some, parameter, **others): obj = parentclass.__new__(cls, **others) obj.some = some obj.parameter = parameter return obj 像这样使用\uuuu init\uuuu有什么区别

中的每个对象都是类的一个子类,它们都使用
\uuuuu new\uuuuuu
而不使用
\uuuuuuu init\uuuuuu
,大多数情况下

def __new__(cls, some, parameter, **others):
    obj = parentclass.__new__(cls, **others)
    obj.some = some
    obj.parameter = parameter
    return obj
像这样使用
\uuuu init\uuuu
有什么区别

def __init__(self, some, parameter, **others):
    parentclass.__init__(self, **others)  # or super().__init__(...)
    self.some = some
    self.parameter = parameter
请看一看。他们希望对象的类是灵活的<代码>数字(…)=>Int/Float/…无法通过
\uuuuu init\uuuu
实现

此外,
\uuuuuu init\uuuuuu
将获得
\uuuu new\uuuuuu
的参数,但您不需要原始参数,请参阅,或者您需要将它们调整为
\uuuuu new\uuuuuu
已经执行的操作(例如)

大多数对象都定义了自己的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,因此可以为它们指定固定的属性。作业可以在
\uuuu new\uuuu
\uuuu init\uuuu
中完成。我不认为需要打开一个新的
\uuuuu init\uuuu
来设置它们,而不进行其他操作——正如Martijn Pieters和user4815162342指出的那样,对象是不可变的

如果更改类,有时会调用一次或两次不调用
\uuuuu init\uuuu

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>
X类(对象):
def_uunew_uu(self):#对不起,self是我道歉的班级!
obj=对象。新的(Y)
返回obj
定义初始化(自):
打印1
>>>Y类(对象):
定义初始化(自):
打印2
>>>X()#no _uinit _uu调用,限制您留在类层次结构中
>>>Y类(X类):
定义初始化(自):
打印2
>>>X()#一次初始化调用
2.
>>>X类(对象):
定义新的(自我):
obj=Y()
返回obj
定义初始化(自):
打印1
>>>Y类(X类):
定义新的(自我):
返回对象。\uuuu新建\uuuuu(自)
定义初始化(自):
打印2
>>>X()#uuu init_uuuuu调用两次,结构从number.py复制
2.
2.
如果我错了,请纠正我。我不认为这个答案是完整的,但我发现值得鼓励的是,除了Martijn Pieters和user4815162342提到的对象应该是不可变的之外,不要使用
\uuu init\uuuuuu


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

我想他们都应该是不可变的?@MartijnPieters——我认为他们需要能够散列,以避免重做a.la备忘录中已经完成的工作。这可能只是一个历史性的意外;旧版本(如0.5.x)的结构要复杂得多,可能是合理的。。。神秘的但这是有道理的