Python基础---面向对象常用魔术方法

目录

 

1.__del__销毁魔术方法

概念

练习

2.__call__

概念

练习一

练习二

练习三

3.__str__

概念

练习

4.__repr__

概念

练习

5.__new__实例化魔术方法

概念

练习

6.Python中的比较is和 ==

概念

练习

7.__hash__

概念

练习


1.__del__销毁魔术方法

概念

触发时机:当一个对象在内存中被销毁的时候自动执行

参数:至少有一个self,接收对象

返回值:无

作用:在对象销毁的时候做一些操作

注意:程序自动调用此方法,不需要我们手动调用。

练习

情况一

结果:

当程序执行完后对象没有用了,就会执行__del__()方法

情况二

结果:

由于per被删除了,因此不能打印出per,会报错

情况三

结果

由于把per的地址赋给了per1,因此即使删除了per,内存中仍有per1指向之前per的地址,便能输出per1,且在程序结束后那块内存被回收的时候才会执行__del__方法

2.__call__

概念

__call__():可以让类的实例具有类似于函数的行为,

进一步模糊了函数和对象之间的概念。

使用方式:

对象后面加括号,触发执行。即:对象() 或者 类()()

练习一

结果:

练习二

结果:

练习三

实现斐波那契数列

class Fibo(object):
    def __init__(self):
        pass
    def __call__(self, num):
        a=1
        b=1
        self.lst=[]
        if num<=2:
            self.lst.append(a)
            self.lst.append(b)
        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 = Fibo()
ret = f(int(input('请输入想要输出的斐波那契数列的长度:')))
print(ret)

结果:

3.__str__

概念

触发时机:使用print(对象)或者str(对象)的时候触发

参数:一个self接收对象

返回值:必须是字符串类型

作用:print(对象时)进行操作,得到字符串,通常用于快捷操作

注意:无

在python中,使用print()函数输出对象名称的时候默认情况下,会打印对象名引用的内存地址,

如果希望打印对象的属性值,可以使用__str__(self)这个方法。

练习

结果

4.__repr__

概念

__repr__():改变对象的字符串显示

- 此方法是__str__()的备胎,如果找不到__str__()就会找__repr__()方法。

- %r 默认调用的是 __repr()方法,如果是字符串会默认加上 ''

-repr()方法默认调用__repr__()方法

练习

结果:

5.__new__实例化魔术方法

概念

触发时机: 在实例化对时触发

参数:至少一个cls 接收当前类

返回值:必须返回一个对象实例

作用:实例化对象

注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。

没事别碰这个魔术方法,先触发__new__才会触发__init__

练习

情况一

如果__new__不复写,默认调用object中的__new__,创建一个对象

结果:

情况二

如果复写了__new__,便调用的是复写的__new__, 而复写的__new__里打印的是一句话,

没有创建对象,下方语句输出必定为空

结果:

情况三

调用父类的__new__方法,创建当前对象

结果:

6.Python中的比较is和 ==

概念

is 比较两个对象的 id 值是否相等,是否指向同一个内存地址;

== 比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了。

练习

情况一

由于==默认会调用对象的 __eq__()方法。继承自 object 的 __eq__ 方法比较两个对象的id,因此肯定不一样,返回的是False

情况二

情况三

结果:

情况四

在实际应用中,有一种情况是处理对象是不是在list里,不在就加入 list的in操作就是通过==来判断是否在list中

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算法来快速查询,节约时间。

自定义对象添加到集合中

在自定义类中,如果没有实现__eq__()和__hash__()方法,会继承object的__eq__()方法和__hash__()方法。

需求:自定义对象添加到集合中,  只要是对象的属性值相同,就认为是同一个对象,就不让添加,因此需要我们手动复写__eq__方法和__hash__方法

object的 hash 值是怎么算的呢,id 是hash 的16倍

注意,如果只定义了__eq__方法,没有定义__hash__方法,__hash__方法会隐式设置成None

猜你喜欢

转载自blog.csdn.net/weixin_44239385/article/details/86502356