1、del
触发时机:当一个对象在内存中被销毁的时候自动执行
参数:至少有一个self,接受对象
作用:在对象销毁的时候做一些操作
注意:无返回值,程序自动调用此方法,不需要我们动手调用
class Cat:
def __init__(self,name):
self.name=name
print('{}来了'.format(self.name))
def __del__(self):
print('{}走了'.format(self.name))
cat=Cat('tom')
print('程序执行完了')
2、call
call():可以让类的实例具有类似于函数的行为,进一步模糊了函数和对象之间的概念。
使用方式:对象后面加括号,触发执行。即:对象()或者类()()
利用__call__求斐波那契数列
class Fib(object):
def __init__(self):
pass
def __call__(self, num):
a,b=1,2
self.lst=[]
if num<=2:
self.lst.append(1)
self.lst.append(2)
else:
for i in range(1,num+1):
self.lst.append(a)
a,b=b,a+b
return self.lst
def __str__(self):
return str(self.lst)
f=Fib()
ret=f(4)
print(ret)
3、repr()
改变对象的字符串显示此方法是__str__()的备胎,如果找不到__str__()就会找到__repr__()f放法。
%r 默认调用的是__repr()放法,如果是字符串会默认加上’’
repr()方法默认调用__repr__()方法
class Person(object):
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return str(self.__dict__)
def __repr__(self):
s='name: %s age: %s'%(self.name,self.age)
return s
per=Person('zs',13)
#有str调str,没str调用repr
print(per)
print('I said: %r'% per)
print('I said: %s'% per)
4、new
实例化魔术方法,触发时机在实例化对时触发
参数:至少一个cls接收当前类
返回值:必须返回一个对象实例
作用:实例化独享对象
注意:实例化对象是object类底层实现,其他类继承了object的__new__才能够实现实例化对象,先触发__new__才触发__init__
练习1、查看__new__方法的执行时机
class Dog(object):
def __new__(cls, *args, **kwargs):
print('-----__new__------')
def __init__(self):
print('-------__init__------')
def __del__(self):
print('------__del__------')
# 只复写__new__()方法
dog=Dog()
print(dog)
练习2、调用父类方法,创建当前对象
class Dog(object):
def __new__(cls,*args,**kwargs):
print('-----__new__-----')
new__=object.__new__(cls)
return new__
dog1=Dog()
print(dog1)
5、str
触发时机:使用print(对象)或者str(对象)的时候触发
参数:一个self接受对象
返回值:必须是字符串类型
作用:print(对象时)进行操作,得到字串符,通常用于快捷操作在python中 使用print()函数输出对象名称的时候默认情况下,会打印对象名引用的内存地址,如果希望打印对象的属性值,可以使用__str__(self)这个方法
练习1、创建Cat类,向控制台打印cat对象的name和age的值。
class Cat:
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return '姓名:{},年龄:{}'.format(self.name,self.age)
cat=Cat('tom',10)
print(cat)
6、Python中的比较is和==
is 比较两个对象的id值是否相等,是否指向同一个内存地址
==比较的是两个对象的内容是否相等,即内存地址可以不一样,内容
一样就可以了。
默认会调用对象的__eq__()方法。继承自object的__eq__方法比较两个
对象的id
练习1、
class Person(object):
def __init__(self,name,age):
self.name=name
self.age=age
def __eq__(self, other):
return self.__dict__==self.__dict__
per1=Person('zs',12)
per2=Person('zs',13)
per3=Person('zs',12)
print(id(per1))
print(id(per2))
print(id(per3))
1、对象值不同进行比较
print(per1 is per2)#False
print(per1 == per2)#True
2、对象值相同进行比较
print(per1 is per3)#False
print(per1 == per3)#True
3、对于自定义对象一般我们认为对象的值相同
print(per1==per3)#True
注意:list的in操作就是通过==来判断是否在list里
lst1=[]
lst1.append(per1)
print(lst1)
if per3 not in lst1:
lst1.append(per3)
print(lst1)
7、hash
哈希,在python中有内置函数的哈希函数hash(),返回一个对象(数字, 字符串,不能直接用于list、set、dictionary)的哈希值
s='a'
ret=hash(s)
print(ret)
在python中set集合要求数a和b的地址相同据是可哈希的,因此set集合会默认调用对象的
__hash__函数进行快速查询如果找到了则调用对象__eq__判断两个是否相同如果相同则不添加,保证数据的唯一性(自动去重)功能dict数据结构的key必须是可哈希的,因为dict是无序的因此通过key的hash算法来快速查询,节约时间
set1={'a','b',[1,2,3]}
print(set1)#报错,因为列表是不可哈希的
自定义对象能不能添加到集合中,默认调用父类的__hash__和__eq__
class Person(object):
def __init__(self,num):
self.num=num
p1=Person(1)
p2=Person(2)
p3=Person(3)
lst=[p1,p2,p3]
set1=set(lst)
print(set1)
object的id值是hash的id值的16倍
print(id(p1)/16)
print(hash(p1))