魔术方法

本文介绍了Python中的魔术方法,包括del、call、repr、new、str等,并解释了它们的触发时机、参数、返回值和作用。同时探讨了比较运算符is和==的区别,以及哈希函数的应用。

魔术方法

1.del
销毁魔术方法
触发时机:当一个对象在内存中被销毁的时候自动执行
参数:至少有一个self,接收对象
返回值:无
作用:在对象销毁的时候做一些操作
注意:程序自动调用此方法,不需要我们手动调用。
2.call
call():可以让类的实例具有类似于函数的行为,
进一步模糊了函数和对象之间的概念。
使用方式:
对象后面加括号,触发执行。即:对象() 或者 类()()
3.repr
repr():改变对象的字符串显示

  • 此方法是__str__()的备胎,如果找不到__str__()就会找__repr__()方法。
  • %r 默认调用的是 repr()方法,如果是字符串会默认加上 ‘’
    -repr()方法默认调用__repr
    ()方法
    4.new
    实例化魔术方法
    触发时机: 在实例化对时触发
    参数:至少一个cls 接收当前类
    返回值:必须返回一个对象实例
    作用:实例化对象
    注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。
    没事别碰这个魔术方法,先触发__new__才会触发__init__
    5.str
    触发时机:使用print(对象)或者str(对象)的时候触发
    参数:一个self接收对象
    返回值:必须是字符串类型
    作用:print(对象时)进行操作,得到字符串,通常用于快捷操作
    注意:无
    在python中 使用print()函数输出对象名称的时候默认情况下,会打印对象名引用的内存地址,如 果希望打印对象的属性值,可以使用__str__(self)
    这个方法。
    6.Python中的比较is和 ==
    is 比较两个对象的 id 值是否相等,是否指向同一个内存地址;
    == 比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了。
    默认会调用对象的 eq()方法。继承自 object 的 eq 方法比较两个对象的id
    注意:
    因为Python 缓存并复用了小的整数和小的字符串,对象42也许并不像我们所说的被回收;相反地,它将可能仍被保存一个系统表中 等待下次你的代码生成 42 来重复利用。尽管这样,大多数种类的对象都会在不再引用时马上回收,对 那些不会被回收的,缓存机制与代码并没有什么关系。
    7.hash
    哈希(hash)也翻译作散列。Hash算法,是将一个不定长的输入,通过哈希函数变换成一个定长的输出,即哈希值。
    这种哈希变换是一种单向运算,具有不可逆性即不能根据哈希值还原出输入信息。常见的hash算法有:SM3、MD5、SHA-1等 。
    Hash主要应用在数据结构以及密码学领域。
    在不同的应用场景下,hash函数的选择也会有所侧重。比如在管理数据结构时,主要要考虑运算的快速性。
    在python中有内置的哈希函数hash(),返回一个对象(数字、字符串,不能直接用于 list、set、dictionary)的哈希值。

在python中set集合要求数据类型是可哈希的,因为set集合会默认调用对象的__hash__函数进行快速查询,如果找到了则调用对象的__eq__判断两个是是否相同,如果相同则不添加。
保证数据的唯一性(自动去重功能)。
dict 数据结构的key必须是可哈希的,因为dict是无序的因此通过key的hash算法来快速查询,节约时间。

1.自定义对象能不能添加到集合中呢?能默认调用父类的__hash__和__eq__
2.object的 hash 值是怎么算的呢,id 是hash 的16倍
3.自定义对象添加到集合中,一般认为两个对象的属性值相同就是同一个对象
–自定义计算规则。
4.注意,如果只定义了__eq__方法,没有定义__hash__方法,__hash__方法会隐式设置成None

在自定义类中,如果没有实现__eq__()和__hash__()方法,会继承object的__eq__()方法和__hash__()方法。
自定义对象添加到集合中,我们一般认为两个对象的属性值相同就是同一个对象。因此需要我们手动复写__eq__方法和__hash__方法。

class A:
    count = 2
    def __init__(self,name):
        self.name = name
    def __del__(self):
        A.count+=1
        print("删除",self.name,"还剩{A.count}个")


    def say(self):
        print(self.name)

class Num:
    def __init__(self,n):
        self.n=n
    def __add__(self, other):
        return self.n+other.n
    def __call__(self, *args, **kwargs):
        result=self.n
        for a in args:
            result*=a
        for k,v in kwargs:
            result+=v
            return result

class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def __str__(self):
        return  str(Person.__dict__)

    def __repr__(self):
        return f"{self.name}{self.age}"


class Car():
    def __new__(cls, *args, **kwargs):
        print("__new__")
    def __init__(self):
        print("__init__")


if __name__ == '__main__':
    p = Person("zs",12)
    print(p)
    print(("ddfr"  %  p))
    # a=Num(10)
    b=Num(20)
    c=(a+b)
    d=a(1,3,4,5)
    print(d)
    a=A("张三")
    b=A("李四")
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值