__init__ __new__区別する

2570 ワード

コードを実行してください:
class A:

    def __init__(self):

        print "A.__init"



    def __new__(self):

        print "A.__new"





class B(object):

    def __init__(self):

        print "B.__init"

        super(B, self).__init__()



    def __new__(cls):

        print "B.__new__"

        return super(B,cls).__new__(cls)





a = A()

b = B()

print(type(a))

print(type(b))

実行結果
A.__initB.__new__B.__init
注意:Aはベースクラスがなく、Bはベースクラスがあり、そして_new__ メソッドと_init__2つの方法には2つの違いがある.
1.self、clsパラメータが異なる、すなわち_new__classmethod.
2.__new__returnがあります.
この2つの問題は概念New-style and classic classesに関連している.参照https://docs.python.org/2/reference/datamodel.html#new-style-and-classc-classes classicとnew style clasがどのように現れたかを表示します.
new styleでもclassicでもisinstance(obj,cls)で判断できます.
aは現実的だがtype'instance'だからだ.でもa._を見るとclass__依然としてaのタイプが見えます.