python——魔术方法

北城余情 提交于 2019-12-18 21:38:50

一、常用魔术方法

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")
# del cat
print("程序结束")``

结果:

tom来了
程序结束
tom走了

2.call call():可以让类的实例具有类似于函数的行为, 进一步模糊了函数和对象之间的概念。

使用方式: 对象后面加括号,触发执行。

即:对象() 或者 类()()

class Person:
    def __init__(self):
        pass
    def eat(self):
        print("吃。。。")
    def __call__(self, num):
        he=0
        for i in range(1,num+1):
            he+=i
        print(he)

person=Person()
person(100)

结果:

5050

3.repr repr():改变对象的字符串显示 ­

此方法是str()的备胎,如果找不到str()就会找repr()方法。 ­

%r 默认调用的是 __repr()方法,

如果是字符串会默认加上 ‘’ ­repr()方法默认调用repr()方法

class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    # def __str__(self):
    #     return str(self.__dict__)
    def __repr__(self):
        return "我叫{},今年{}".format(self.name,self.age)
person=Person("zs",20)
print(person)

# text="i am 22 year old"
# print("i said :%r" % person)
# print("i said: %s" % text)
# print("i said: %s" % person)

结果:

我叫zs,今年20

4.new 实例化魔术方法

触发时机: 在实例化对时触发 参数:至少一个cls 接收当前类

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

注意:实例化对象是Object类底层实现,其他类继承了Object的new才能够实现 实例化对象。 没事别碰这个魔术方法,先触发new才会触发init

class Dog(object):
    def __new__(cls, *args, **kwargs):
        print("---new---")
        new__=object.__new__(cls)
        return new__
    def __init__(self):
        print("init")

    def __del__(self):
        print("del")
dog=Dog()
print(dog)

结果:

del
  1. hash
    哈希(hash)也翻译作散列。

Hash算法,是将一个不定长的输入,通过哈希函 数变换成一个定长的输出,即哈希值。 这种哈希变换是一种单向运算,具有不可逆性即不能根据哈希值还原出输入信 息。

常见的hash算法有:SM3、MD5、SHA­1等 。

Hash主要应用在数据结构以及密码学领域。 在不同的应用场景下,hash函数的选择也会有所侧重。

比如在管理数据结构 时,主要要考虑运算的快速性。

class Person:
    def __init__(self,name):
        self.name=name
    def __eq__(self, other):
        return self.__dict__==other.__dict__
    def __hash__(self):
        return hash(self.name)


p1=Person("zs")
p2=Person("ls")
p3=Person("ww")
# print(p1==p2)

lst=[p1,p2,p3]
set2=set(lst)
print(set2)

结果;

object at 0x0000029D7E584D68>, <__main__.Person object at 0x0000029D7E584D30>, <__main__.Person object at 0x0000029D7E584DD8>}
  1. 自定义对象能不能添加到集合中呢?能默认调用父类的hash和eq

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

  3. 自定义对象添加到集合中,一般认为两个对象的属性值相同就是同一个对象 ­­自定义计算规则。

  4. 注意,如果只定义了eq方法,没有定义hash方法,hash方法会隐式设置成 None 在自定义类中,如果没有实现eq()和hash()方法,会继承object的eq()方法和 hash()方法。
    hash()函数默认调用Object类的hash()方法。Hash值是对象的id值/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!