常用魔术方法

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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值