面向对象-双下方法

Posted itdong-1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象-双下方法相关的知识,希望对你有一定的参考价值。

一.析构方法:__del__ :释放一个空间之前执行

用处:某对象借用了操作系统的资源,要通过析构方法归还回去 (垃圾回收机制)

操作系统资源:文件资源,网络资源

class A:
    def __del__(self):
              #析构方法,del A的对象,会自动触发这个方法
        print(执行方法)
a = A()
del a  #对象的删除 del
print(a)  #找不到a 会报错    
#处理文件例子
class File:
    def __init__(self,file_path):
        self.f = open(file_path)
        self.name = alex

    def read(self):
        self.f.read(1024)

    def __del__(self):#去归还/释放一些在创建对象的时候借用的一些资源
        #del 对象的时候 程序员触发(主动)
        #python解释器的垃圾回收机制 回收这个对象所占的内存的时候 python自动触发的
        self.f.close() 

f= File(文件名)
f.read()
#不管是主动还是被动,这个f对象总会被清理掉,被清理掉就触发__del__方法,触发这个方法就会归还操作系统
#的文件资源

注意:f.close 是释放操作系统打开的文件资源 del f 是释放python解释器的内存

 二.item系列: 和对象使用[]访问值有关

用处:在一些内置模块中,有一些特殊的方法,要求对象必须实现__getitem__/__setitem__才能使用

class A:
    def __getitem__(self, item):
        return getattr(self,item)
    def __setitem__(self, key, value):
        setattr(self,key,value)
    def __delitem__(self,key):
        delattr(self,key)
a = A()
print(a.__dict__)
a[k] = v
print(a.__dict__)
print(a[k])
del a[k]
print(a.__dict__)
#结果:
{}
{k: v}
v
{}

三.__hash__/__sq__

hash方法:底层数据结构基于hash值寻址的优化操作,hash是一个算法,能够把某一个要存在内存里的

值通过一系列计算,保证不同值的hash结果是不一样的.

记住:对同一值多次执行python代码的时候hash值是不一样的

  对同一值一次性执行python代码的时候hash值永远不变

ps:字典的key基于哈希算法,set集合去重机制也是基于hash算法

set集合去重机制:先通过哈希算法,取到一个空间,看里面有没有值,没有就填进去,有就在对值进行比较.不一样的话,进行二次寻址,,一样的话,覆盖.

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

__eq__  ==这个语法是完全和__eq__相关的,__eq__返回的所有值都是当成布尔值来查看

class A:
    def __init__(self,name,age):
        self.name = name
        self.age = age
a = A(张三,20)
a1 = A(张三,20)
print(a == a1)
#结果:Flase #判断的是内置地址所以为Flasd

class A:
    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:
            return True
a = A(张三,20)
a1 = A(张三,20)
print(a==a1)
#结果:True

一道面试题

技术分享图片
 一个类
# 对象的属性 : 姓名 性别 年龄 部门
# 员工管理系统
# 内部转岗 python开发 - go开发
# 姓名 性别 年龄 新的部门
# alex None 83 python
# alex None 85 luffy
600个员工
# 如果几个员工对象的姓名和性别相同,这是一个人
# 请对这600个员工做去重

class Employee:
    def __init__(self,name,age,sex,partment):
        self.name = name
        self.age = age
        self.sex = sex
        self.partment = partment
    def __hash__(self):
        return hash(%s%s%(self.name,self.sex))
    def __eq__(self, other):
        if self.name == other.name and self.sex == other.sex:
            return True
employ_lst = []
for i in range(200):
    employ_lst.append(Employee(alex,i,male,python))
for i in range(200):
    employ_lst.append(Employee(wusir,i,male,python))
for i in range(200):
    employ_lst.append(Employee(taibai, i, male, python))

# print(employ_lst)
employ_set = set(employ_lst)
for person in employ_set:
    print(person.__dict__)
View Code

set的去重机制:先调用hash,在调用eq,eq不是每次都触发,只有哈希值相等的时候才触发

 



以上是关于面向对象-双下方法的主要内容,如果未能解决你的问题,请参考以下文章

面向对象之: 反射和双下方法

Python面向对象反射,双下方法

面向对象-双下方法

Python面向对象之反射,双下方法

python 面向对象专题:元类type反射函数与类的区别特殊的双下方法

python 面向对象专题:元类type反射函数与类的区别特殊的双下方法