標籤:

python 類中__new__ 和 __init__方法區別

python中有二個特殊的方法__new__ 和 __init__ 方法。聽黃哥來講解。

__init__ 方法為初始化方法, __new__方法才是真正的構造函數。

1、__new__方法默認返回實例對象供__init__方法、實例方法使用。

請看下面的代碼。

# coding:utf-8nnnclass Foo(object):n 黃哥python培訓,黃哥所寫n price = 50nn def how_much_of_book(self, n):n print(self)n return self.price * nnnfoo = Foo()nprint(foo.how_much_of_book(8))nprint(dir(Foo))n

分析上面的代碼,這個類實例化過程,Foo類繼承object類,繼承了object的__new__方法。

當你沒有重載這個方法(通俗來說,你沒有在Foo類中沒有寫__new__方法),Foo實例化是默認自動調用父類__new__方法,這個方法返回值為類的實例(self),提供這個函數how_much_of_book,默認的第一個參數self。

# coding:utf-8nnnclass Foo(object):n price = 50nn def __new__(cls, *agrs, **kwds):n inst = object.__new__(cls, *agrs, **kwds)n print(inst)n return instnnn def how_much_of_book(self, n):n print(self)n return self.price * nnnfoo = Foo()nprint(foo.how_much_of_book(8))n# <__main__.Foo object at 0x1006f2750>n# <__main__.Foo object at 0x1006f2750>n# 400n

請看上面代碼,Foo類中重載了__new__方法,它的返回值為Foo類的實例對象。

2、__init__ 方法為初始化方法,為類的實例提供一些屬性或完成一些動作。

# coding:utf-8nnnclass Foo(object):nn def __new__(cls, *agrs, **kwds):n inst = object.__new__(cls, *agrs, **kwds)n print(inst)n return instnnn def __init__(self, price=50):n self.price = pricenn def how_much_of_book(self, n):n print(self)n return self.price * nnnfoo = Foo()nprint(foo.how_much_of_book(8))nn# <__main__.Foo object at 0x1006f2750>n# <__main__.Foo object at 0x1006f2750>n# 400n

3、__new__ 方法創建實例對象供__init__ 方法使用,__init__方法定製實例對象。

__new__ 方法必須返回值,__init__方法不需要返回值。(如果返回非None值就報錯)

4、一般用不上__new__方法,__new__方法可以用在下面二種情況。

__new__() is intended mainly to allow subclasses of immutable types (like int, str, or tuple) to customize instance creation. It is also commonly overridden in custom metaclasses in order to customize class creation.

繼承不可變數據類型時需要用到__new__方法(like int, str, or tuple) 。

# coding:utf-8nnnclass Inch(float):n "Convert from inch to meter"n def __new__(cls, arg=0.0):n return float.__new__(cls, arg*0.0254)nnprint(Inch(12))n

用在元類,定製創建類對象。

# coding:utf-8n來自http://eli.thegreenplace.net/2011/08/14/python-metaclasses-by-examplennclass MetaClass(type):nn def __new__(meta, name, bases, dct):n print -----------------------------------n print "Allocating memory for class", namen print metan print basesn print dctn return super(MetaClass, meta).__new__(meta, name, bases, dct)nn def __init__(cls, name, bases, dct):n print -----------------------------------n print "Initializing class", namen print clsn print basesn print dctn super(MetaClass, cls).__init__(name, bases, dct)nnnclass Myclass(object):n __metaclass__ = MetaClassnn def foo(self, param):n print paramnnnp = Myclass()np.foo("hello")nn# -----------------------------------n# Allocating memory for class Myclassn# <class __main__.MetaClass>n# (<type object>,)n# {__module__: __main__, foo: <function foo at 0x1007f6500>, __metaclass__: <class __main__.MetaClass>}n# -----------------------------------n# Initializing class Myclassn# <class __main__.Myclass>n# (<type object>,)n# {__module__: __main__, foo: <function foo at 0x1007f6500>, __metaclass__: <class __main__.MetaClass>}n# hellon

推薦閱讀:

樹莓派Raspberry區域網視頻小車教程
Python從零開始系列連載(27)——Python特色數據類型(函數)(中)
Python數據分析之讀取文件
R語言中不能進行深度學習?

TAG:Python |