💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 打印id() 如果把类用print进行输出的话,会看到如下信息 ![](https://box.kancloud.cn/1b36d2a18d7dc035021fcc54c8dcd221_561x45.png) 即看到的是创建出来的对象在内存中的地址 # `__str__()`方法 返回对象的描述信息 ~~~ class Car: def __init__(self, newWheelNum, newColor): self.wheelNum = newWheelNum self.color = newColor def __str__(self): msg = "嘿。。。我的颜色是" + self.color + "我有" + int(self.wheelNum) + "个轮胎..." return msg def move(self): print('车在跑,目标:夏威夷') BMW = Car(4, "白色") print(BMW) ~~~ ![](https://box.kancloud.cn/2f90ebe333156698ef7f1ad8c1d2b5ce_588x56.png) 在python中方法名如果是`__xxxx__()`的,那么就有特殊的功能,因此叫做“魔法”方法 当使用print输出对象的时候,只要自己定义了`__str__(self)`方法,那么就会打印从在这个方法中return的数据 # `__del__()`方法 创建对象后,python解释器默认调用`__init__()`方法; 当删除一个对象时,python解释器也会默认调用一个方法,这个方法为`__del__()`方法 ~~~ import time class Animal(object): # 初始化方法 # 创建完对象后会自动被调用 def __init__(self, name): print('__init__方法被调用') self.__name = name # 析构方法 # 当对象被删除时,会自动被调用 def __del__(self): print("__del__方法被调用") print("%s对象马上被干掉了..."%self.__name) # 创建对象 dog = Animal("哈皮狗") # 删除对象 del dog cat = Animal("波斯猫") cat2 = cat cat3 = cat print("---马上 删除cat对象") del cat print("---马上 删除cat2对象") del cat2 print("---马上 删除cat3对象") del cat3 print("程序2秒钟后结束") time.sleep(2) ~~~ 结果 ![](https://box.kancloud.cn/8ce9e82e8a43af026ad8d6b0c36777e1_607x282.png) 总结 * 当有1个变量保存了对象的引用时,此对象的引用计数就会加1 * 当使用del删除变量指向的对象时,如果对象的引用计数不会为0,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除 # `__new__`方法 ~~~ class A(object): def __init__(self): print("这是 init 方法") def __new__(cls): print("这是 new 方法") return object.__new__(cls) A() ~~~ 返回 ~~~ 这是 new 方法 这是 init 方法 ~~~ `__new__`至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供 `__new__`必须要有返回值,返回实例化出来的实例,这点在自己实现`__new__`时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例 `__init__`有一个参数self,就是这个`__new__`返回的实例,`__init__`在`__new__`的基础上可以完成一些其它初始化的动作,`__init__`不需要返回值 我们可以将类比作制造商,`__new__`方法就是前期的原材料购买环节,`__init__`方法就是在有原材料的基础上,加工,初始化商品环节 # `__dict__`方法 用来获取所有实例属性 ~~~ class T(object): num= 0 def __init__(self, age): self.age = age t = T(11) print(t.__dict__) ~~~ 输出 ~~~ {'age': 11} ~~~ # `__call__` `__init__`方法执行是由创建对象触发的. 即: 对象=类名() 而对于`__call__`方法执行是由对象加括号触发的,即: 对象()或类()() ~~~ class Foo: def __init__(self): pass def __call__(self, *args, **kwargs): print('__call__') obj = Foo() # 执行 __int__ obj() # 执行__call__ ~~~