6

のすべてのオブジェクトはBasicsympyクラスのサブクラスであり、それらはすべてwithoutを使用します。ほとんどの場合、次のようなものです。__new____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を見てください 。彼らは、オブジェクトのクラスが柔軟であることを望んでいます。Number(...) => Int/Float/...では達成できません__init__

さらに、__init__は の引数を取得します__new__が、元の引数は必要ありません。matexpr.pyを参照するか既に実行したものに適合させる必要があります__new__(たとえば)。__reduce__

ほとんどのオブジェクトは独自に定義するため、オブジェクト__slots__に割り当てることができる固定属性があります。__new__代入はとで行うことができます__init__。それらを設定するだけで他の操作を行わないために新しいものを開く必要はないと思います__init__-Martijn Pietersとuser4815162342 [source]が指摘したように、オブジェクトは不変です。

__init__クラスを変更すると、1 回または 2 回呼び出されないことがあります。

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 に答える