举例代码:
class A:
def init(self):
print(self)
print(“这是构造方法”)
def new(cls, *args, **kwargs):
print(id(cls))
print(“这是new 方法,相当于__init__只是最后的那盘菜,而__new__才是得到食材”)
ret = object.new(cls)
print(ret)
return ret
@classmethod
def FA(cls):
print(“这是类方法,默认是类对象调用方法,参数最好使用默认的cls”)
@staticmethod
def FB(lalala):
print(“这是静态方法,不像普通方法,默认对象调用,(默认self作为函数参数00),这个方法得自己写”)
print(id(A))
print(A())
print("#"*60)
A.FA()
a = A()
#A.FB() a.FB() #报错,静态方法,不像普通方法,默认对象调用
A.FB(“aaaaa”)
运行结果:
2193562339896
2193562339896
这是new 方法,相当于__init__只是最后的那盘菜,而__new__才是得到食材
<main.A object at 0x000001FEBC74D5C0>
<main.A object at 0x000001FEBC74D5C0>
这是构造方法
<main.A object at 0x000001FEBC74D5C0>
############################################################
这是类方法,默认是类对象调用方法,参数最好使用默认的cls
2193562339896
这是new 方法,相当于__init__只是最后的那盘菜,而__new__才是得到食材
<main.A object at 0x000001FEBC74D5C0>
<main.A object at 0x000001FEBC74D5C0>
这是构造方法
这是静态方法,不像普通方法,默认对象调用,(默认self作为函数参数00),这个方法得自己写
Process finished with exit code 0
总结:
0、静态方法,不像普通方法,默认对象调用,(默认self作为函数参数00),这个方法调用参数得自己写
1、 new 至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动 提供
2、 new 必须要有返回值,返回实例化出来的实例,这点在自己实现 new 时要特别注 意,可以return父类 new 出来的实例,或者直接是object的 new 出来的实例
3、 init 有一个参数self,就是这个 new 返回的实例, init 在 new 的基础上 可以完成一些其它初始化的动作, init 不需要返回值
我们可以将类比作制造商, new 方法就是前期的原材料购买环节, init 方法就是在 有原材料的基础上,加工,初始化商品环节