python 其他类型的方法

1. item系列
在内置的模块中,
有一些特殊的方法,要求对象必须实现__getitem__/__setitem__才能使用
2. __del__
构造方法 申请一个空间
析构方法 释放一个空间之前执行
某对象借用了操作系统的资源,还要通过析构方法归还回去: 文件资源,网络资源
不管是主动还是被动,这个object对象总是会被清理掉,被清理掉就会触发__del__方法,
触发这个方法就会归还操作系统的文件资源
是一个垃圾回收机制

python解释器在内部就能搞定的事儿.
申请一块空间,操作系统分配给你的
在这块空间之内的所有事儿,归你的python解释器来管理

3. __hash__
hash方法
底层数据结构基于hash值寻址的优化操作
hash是一个算法
能够把某一个要存在内存里的值通过一系列计算
保证不同值的hash结果是不一样的
'2431231234355687757' ==>234728368923
对同一个值在多次执行python代码的时候hash值是不同的
但是对同一个值在同一次执行python代码的时候hash值是不变的

set集合 - hash算法 先判断hash,再判断值
(先判断hash(快),当两个hash的值不同,而内存地址相同时,再判断值(慢,要一个个的判断))
当一个hash的值,得出一个内存地址,而里面有存在数据时,才判断这个值和我要储存的值是都一样的,
如果一样覆盖去重,如果不一样,二次寻址给这个值换个地方
hash(obj) # obj内部必须实现了 __hash__方法

4. __eq__
"=="这个语法,是完全和__eq__ 触发的


1. item系列
class File:
    def __init__(self,lst):
        self.lst = lst
    def __getitem__(self, item):
        return self.lst[item]
    def __setitem__(self, key, value):
        self.lst[key] = value
    def __delitem__(self, key):
        self.lst.pop(key)

f = File(["小王","小明","小张","小李","小黄"])
print(f.lst[0]) # __init__方法
print(f[0])     # __getitem__
f[2] = "人人"     # __setitem__ 修改
print(f.lst[2])
print(f.lst)
del f[4]        # __delitem__
print(f.lst)

2. __del__ ==> 析构方法

class File:
    # 处理文件,要先创建一个file_path
    def __init__(self,file_path):
        self.f = open(file_path)    # f是对象,self.f是文件句柄

    def read(self):
        ret = self.f.read(5)    # self.f是文件句柄, 读取文件里面的内容
        print(ret)  # 内容

    def __del__(self):  # 是去归还/释放一些在创建对象的时候借用的一些资源

        # del 对象的时候 , 是程序员触发的
        # python解释器的垃圾回收机制,回收这个对象所占内存的时候,python自动触发的
        print(555)
        self.f.close()  # 关闭文件

f = File('file_path') # 会自动触发__del__这个方法
print(f)
# del f     # 对象的删除 del触发析构方法
# print(f)    # 会报错
f.read()    # 执行函数打印内容

3. __hash__方法

# hash方法
print(hash("hash"))
print(hash("hash"))
print(hash("hash"))
# 多行相同的代码同一次性执行的值都相同,
# 多次执行的值是不相同的(也就是第一次执行的值和第二次执行的值是不相同的)

# hash - 内置函数
    # set集合 -- hash算法 先判断hash,再判断值
    # (先判断hash(快),当两个hash的值不同,而内存地址相同时,再判断值(慢,要一个个的判断))
    # 当一个hash的值,得出一个内存地址,而里面有存在数据时,才判断这个值和我要储存的值是都一样的,
    # 如果一样覆盖去重,如果不一样,二次寻址给这个值换个地方

    # hash(obj)   # obj内部必须实现了 __hash__方法

# 集合 -- hash算法
# info = {"ds",2,4,3,43,4,1}    # 在集合里面有hash算法
# print(info)
# 字典 -  hash算法
# dic = {"key":"value"}     # 字典中找值快,是用hash算法

4. __eq__方法

class file:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __eq__(self, other):
        if self.name == other.name and self.age == other.age:   # 判断值如果相等返回True
            return True
        else:
            return False

a = file("小明",18)
a1 = file("小明",18)

print(a,a1)
print(a==a1)   # 对象的值相同,True
print(a is a1)  # 判断出内存地址不同,False

# 与上面的类似
b = {'小明':18}
b1 = {'小明':18}
print(id(b),id(b1))
print(b == b1)       # "==" 这里值相等,True
print(b is b1)      # 值相同,但是内存地址不行同





猜你喜欢

转载自www.cnblogs.com/Pengdachui-1/p/11980505.html