一、常用魔术方法
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
- hash
哈希(hash)也翻译作散列。
Hash算法,是将一个不定长的输入,通过哈希函 数变换成一个定长的输出,即哈希值。 这种哈希变换是一种单向运算,具有不可逆性即不能根据哈希值还原出输入信 息。
常见的hash算法有:SM3、MD5、SHA1等 。
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>}
-
自定义对象能不能添加到集合中呢?能默认调用父类的hash和eq
-
object的 hash 值是怎么算的呢,id 是hash 的16倍
-
自定义对象添加到集合中,一般认为两个对象的属性值相同就是同一个对象 自定义计算规则。
-
注意,如果只定义了eq方法,没有定义hash方法,hash方法会隐式设置成 None 在自定义类中,如果没有实现eq()和hash()方法,会继承object的eq()方法和 hash()方法。
hash()函数默认调用Object类的hash()方法。Hash值是对象的id值/
来源:CSDN
作者:heng302926
链接:https://blog.csdn.net/HENG302926/article/details/103604125