构造和析构
魔法方法总是被"__init__"两个下划线所包围
魔法方法是面对对象Python的一切
魔法方法的魔力总是能够在适当的时候被调用
例子
class Rectangle:
'''定义一个矩形类,需要长宽两个参数,拥有计算周长和面积
的两个方法,需要对象在初始化的时候,拥有长和宽两个参数
因此需要重写__init__方法'''
def __init__(self,x,y):
self.x = x
self.y = y
def Zc(self):
return self.x + self.y
def Cc(self):
return self.x * self.y
运行后
>>> dd = Rectangle(2,4)
>>> dd.Zc()
6
>>> dd.Cc()
8
很容易理解吧。
注意的是,__init__()方法的返回值一定是None,不能是其他,例子
>>> class A:
... def ___init__(self):
... return "A for A-Cup"
...
>>> cup = A()
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module>
cup = A()
TypeError: __init__() should return None, not 'str'
这里有个误差,有的同学,是没有报错的。
可能是版本不同,而且上面的程序也没达到咱们要的效果
>>> cup = A()
>>>A for A-Cup
这是咱们想得到的,根据魔法方法__init__的要求,返回值一定要是None大家记住就好。
在魔法方法中,也是讲究谁是老大的,也就是,谁是第一个被调用的,这里有的同学会说那肯定是(__init__())其实并不是,新知识点
__new__(cls[,....])才是一个对象实例化的时候所调用的第一个方法
看例子
class Capstr(str):
def __new__(cls,string):
string = string.upper()
return str.__new__(cls,string)
运行后
>>> a = Capstr("tianjun")
>>> a
'TIANJUN'
>>>
如果说__init__()和__new__()方法是对象的构造器的话,那么python也析构了一个构造器,__del__()方法,当对象被销毁时,这个方法就一定会被调用,但要注意的是,并非del x就等同于自动调用了x.__del__(),__del__()方法是当垃圾回收机制回收这个对象的时候调用的
看例子
>>> class C():
def __init__(self):
print('我是__init__()方法')
def __del__(self): \
print('我是__del__()方法')
>>> c1 = C()
我是__init__()方法
>>> c2 = c1
>>> c3 = c2
>>> del c1
>>> del c2
>>> del c3
我是__del__()方法