魔法方法
- new 是在一个对象实例化的时候所调用的第一个方法
- 它的第一个参数是这个类,其他的参数是用来直接传递给 init 方法
- new 决定是否要使用该 init 方法,因为 new 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 new 没有返回实例对象,则 init 不会被调用
定义:魔法方法总是被双下划线包围
特征:总能在适当的时候被自动调用
1.init(self)
构造方法,实例化对象时,会首先被调用
Eg:class CC:
Def init (self, x, y):
Self.x = x
Self.y = y
Self.x:类实例化对象的局部变量
X:实例化对象时传的参数
注意:new有返回值,构造函数(init)没有返回值
2.new(cls[,…])
含义:对象实例化时调用的方法,和其他魔术方法不同,第一个参数是class,在init()之前被调用,返回class类的实例对象(一般情况下很少去重写new方法,当继承一个不可变的类时,又需要进行修改的时候才会重写)
Eg:
class String1(str):
def new(cls, string):
string = string.upper()
return str.new(cls, string)
a = String1(“hello python”)
print(a)
实行结果:
HELLO PYTHON
3.del(self) 析构器(垃圾回收机制)
Del x != x.del() 是不相等的
Eg:
class String1(str):
def new(cls, string):
print(“new”)
string = string.upper()
return str.new(cls, string)
def init(self,x):
print(“init”)
def del(self):
print(“del”)
a = String1(“hello python”)
b = a
c = a
d = a
del c
del b
del d
print(a)
del a
实行结果:
new
init
HELLO PYTHON
del
结论|:类中魔法方法调用顺序:new->init->del
在创建实例化对象a的同时,将a的引用给类b,c,d,使用del删除这些引用时候,不会调用类对象中的__del__(self)函数,在最后程序结束时才会调用类对象的__del__(self)函数
Eg:
class String1(str):
def new(cls, string):
print(“new”)
string = string.upper()
return str.new(cls, string)
def init(self,x):
print(“init”)
def del(self):
print(“del”)
a = String1(“hello python”)
b = a
c = a
d = a
del c
del b
del d
print(a)
del a #真正删除实例化对象a
print(a)
new
init
del
2.算术运算:魔法方法提供了自定义对象的数值处理,通过对魔法方法的重写,自定义任何对象间的算术运算
a = int(“123”)
b = int(“456”)
解析:类对象int通过参数“123”,”465”实例化一个对象,赋值给a,b
a + b = 579(对象还可以进行算术运算)
1.算术运算
class Add(int):
def add(self, other): # 重写类int中的魔法方法add
return int.add(self, other) # 返回类int中的魔法方法