_ _ init_ ()與 _ new_ _()的關係和區別
1、_ _ init _ _ ()是初始化方法,創建對象之後,就立刻被默認調用了,可接收參數
2、_ _ new_ _ ()至少需要一個參數cls,代表當前類,此參數在實例化時由Python解釋器自動識別
3、_ _ new_ _ ()必須要有返回值,返回實例化出來的實例
4、_ _ init _ _ ()有一個參數self,就是這個_ _ new_ _ ()返回的實例,_ _ init _ _ ()在_ _ new_ _ ()的基礎上可以完成一些其他初始化的動作,_ _ init _ _ ()不需要返回值
5、如果_ _ new _ _ ()創建的是當前類的實例,會自動調用_ _ init _ _ ()函數,通過return語句裏面調用的返回的_ _ new_ _()函數的第一個參數是cls來保證是當前類實例
# Author: Mr.XUe
# 2019.10.30
class MyType(type):
def __init__(self, what, base=None, dict=None):
super(MyType, self).__init__(what, base, dict)
def __call__(self, *argv, **kwargv):
obj = self.__new__(self, *argv, **kwargv)
self.__init__(obj)
class Foo(object):
__metaclass__ = MyType
def __init__(self, name):
self.name = name
def __new__(cls, *argv, *kwargv):
# 這一塊可以添加自己的小功能
return object.__new__(cls, argv, kwargv) # 繼承父類的__new__方法
obj = Foo("bob")
類的創建方法
# Author: Mr.Xue
# 2019.10.30
# 第2種方式
def func(self):
print("hello world")
def __init__(self, name):
self.name = name
print("---")
Foo = type("Foo", (object,), {"func": func, '__init__': __init__})
f = Foo('Bob')
f.func()