__init__ __new__区別する
2570 ワード
コードを実行してください:
実行結果
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のタイプが見えます.
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のタイプが見えます.