python中常用的魔法函数
init()
所有类的超类object,默认包含__init__()实现,这个函数会在对象初始化的时候调用,我们可以选择实现,也可以选择不实现,一般建议是实现的,不实现对象属性就不会被初始化,虽然我们仍然可以对其进行赋值,但是它已经成了隐式的了
class Test():
def __init__(self, name):
self.name = name
t = Test("11")
t.name
str()
直接打印对象的实现方法,__str__是被print函数调用的,一般都是return一个什么东西,这个东西应该是以字符串的形式表现的。如果不是要用str()函数转换,我们可以直接print的对象都是实现了__str__这个方法的
class Test():
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
print(Test("11"))
new()
在object类中存在一个静态的__new__(cls, *args, **kwargs)方法,该方法需要传递一个参数cls,cls表示需要实例化的类,此参数在实例化时由Python解释器自动提供,__new__方法必须有返回值,且返回的是被实例化的实例,只有在该实例返回后才会调用__init__来进行初始化,初始化所用的实例就是__new__返回的结果,也就可以认为是self
class Test(object):
def __init__(self):
print("__init__")
self.name = 111
def __new__(cls, *args, **kwargs):
print(cls)
return object.__new__(cls, *args, **kwargs)
def __str__(self):
return str(self.name)
t = Test()
print(t)
注意
__init__() __new__(比较)
1.用法不同
new__用于创建实例,在创建实例之前进行调用,是类级别的方法,属于静态方法
init__用户初始化实例 在实例对象创建之后调用,初始化实例对象的属性值
2.传参不同
new()至少有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别
init()至少有一个参数self,就是这个__new()返回的实例,init()在__new()的基础上完成一些初始化的操作
3.返回值不同
new 必须有返回值 返回实例对象
init 没有返回值
unicode()
unicode()方法是在一个对象上调用unicode()时被调用的。因为Django的数据库后端会返回Unicode字符串给model属性,所以我们通常会给自己的model写一个__unicode__()方法。如果定义了__unicode__()方法但是没有定义__str__()方法,Django会自动提供一个__str__()方法调用 unicode()方法,然后把结果转换为UTF-8编码的字符串对象,所以在一般情况下,只定义__unicode__()方法,让 Django来处理字符串对象的转换
class Test(object):
def __init__(self):
self.name = "李四"
def __unicode__(self):
return str(self.name)
t = Test()
print(t.name)
call()
对象通过提供__call__()方法可以模拟函数的行为,如果一个对象提供了该方法,就可以像函数一样使用它
class Test(object):
def __init__(self):
self.name = "李四"
def __call__(self, x):
return x + 1
t = Test()
print(t(11))
len()
len调用后会调用对象的__len__函数
repr()
函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式,所以print展示的都是str的格式
class Test(object):
def __init__(self):
self.name = "李四"
def __repr__(self):
return self.name
t = Test()
print(t)
setattr()
设置函数的属性
getattr()
获取对象属性,只有在属性没有找到的时候调用
setitem()
该函数可以给对象赋值,我们可以以下标的方式对其进行操作
getitem()
与上函数相反,__getitem__可以使对象支持已下标的方式获取值
delattr()
本函数的作用是删除属性,实现了该函数的类可以用del 命令来删除属性
delitem()
该函数支持以下标方式删除对象数据
iter()
只要定义了__iter__()方法对象,就可以使用迭代器访问
del()
一个析构器,或者回收器,在对象引用数降到0时执行,有时可能还需要等一会再执行,所以一般不推荐使用,但是在代码中我们偶尔可以用它来实现一些必须要做的,但是并不紧急的事