__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。可根据初始化的需要对该方法进行改写:
class Rectangle:
def __init__(self,x,y):
self.x = x
self.y = y
def getPeri(self):
return (self.x + self.y) * 2
def getArea(self):
return self.x * self.y
__init__方法的返回值是None,不能尝试对返回值进行改写:
class A:
def __init__(self):
return 'ABC'
此时尝试创建一个类A的实例化对象,会报错:
>>> a = A()
Traceback (most recent call last):
File "", line 1, in
a = A()
TypeError: __init__() should return None, not 'str'
__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。cls是指代类的参数,后面的可选参数会在实例化时原封不动地传给__init__方法。
通常,该方法将返回一个cls类的实例化对象。当然,也可以对其进行改写以返回其他类的实例化对象。
需要说明的是,new方法平时是极少去重写的,一般用Python默认的方案即可,但是有一种情况我们需要重写new魔法方法,就是继承一个不可变类型的时候,又需要进行些改的时候,那么它的特性就显得尤为重要了。
class CapStr(str):
def __new__(cls,string):
string = string.upper()
return str.__new__(cls,string)
>>> a = CapStr('I love FichC.com!')
>>> a
'I LOVE FICHC.COM!'
总结:
参考来源:https://blog.csdn.net/qq_41020281/article/details/79638370
del x 并不是自动调用 x.__del__()。当没有任何变量引用某个对象时,由于Python的垃圾回收机制,会自动调用这个对象的__del__方法将其清除。
class C:
def __init__(self):
print('调用init')
def __del__(self):
print('调用del')
c1 = C()
c2 = c1
c3 = c2
再依次执行如下代码:
>>>del c3
>>>del c2
>>>del c1
调用del
可见,调用del x并不是让系统自动调用x.__del__(),只有当无变量引用该对象时,才会自动调用该对象的__del__方法。