_ _ 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()