python-面向对象-内置方法补充
Posted 呜咽的时光喵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-面向对象-内置方法补充相关的知识,希望对你有一定的参考价值。
__del__
item系列
__getitem__
__setitem__
__delitem__
__hash__
__eq__
构造方法 申请一个空间
析构方法 释放一个空间之前执行
某对象借用了操作系统的资源,还要通过析构方法归还回去 : 文件资源 网络资源
# 垃圾回收机制 class A: def __del__(self): # 析构方法 del A的对象 会自动触发这个方法 print(\'执行我了\') a = A() del a # 对象的删除 del print(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__方法,触发这个方法就会归还操作系统的文件资源
python解释器在内部就能搞定的事儿
申请一块儿空间 操作系统分配给你的
在这一块儿空间之内的所有事儿 归你的python解释器来管理
对象 --> 内存
f = open(\'wenjian\') # python --> 操作系统 --> 硬盘里的文件 --> 文件操作符 f.close() # 文件操作符 #del f #释放完后自动帮你关闭文件
item系列 和对象使用[]访问值有联系
obj = {\'k\':\'v\'} print(obj) # 字典的对象 print(obj[\'k\'])
在内置的模块中,
有一些特殊的方法,要求对象必须实现__getitem__/__setitem__才能使用
class B: 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) b = B([\'111\',\'222\',\'ccc\',\'ddd\']) print(b.lst[0]) print(b[0]) b[3] = \'alex\' print(b.lst) del b[2] print(b.lst)
hash方法
底层数据结构基于hash值寻址的优化操作
hash是一个算法
能够把某一个要存在内存里的值通过一系列计算,
保证不同值的hash结果是不一样的
\'127647862861596\' ==> 927189778748
对同一个值在多次执行python代码的时候hash值是不同
但是对同一个值 在同一次执行python代码的时候hash值永远不变
print(hash(\'abc\')) # 6048279107854451739
print(hash(\'abc\'))
print(hash(\'abc\'))
字典的寻址 - hash算法
d = {\'key\':\'value\'} # hash - 内置函数
set集合
se = {1,2,2,3,4,5,\'a\',\'b\',\'d\',\'f\'} print(se)
d = {\'key\':\'v1\',\'key\':\'v2\'} print(d[\'key\'])
hash(obj) #obj内部必须实现了__hash__方法
__eq__
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(\'alex\',83) aa = A(\'alex\',83) aa2 = A(\'alex\',83) aa3 = A(\'alex\',83) aa4 = A(\'alex\',83) aa5 = A(\'alex\',83) aa6 = A(\'alex\',83) print(a,aa) print(aa3 == aa == aa4) # ==这个语法 是完全和__eq__
以上是关于python-面向对象-内置方法补充的主要内容,如果未能解决你的问题,请参考以下文章
python学习8_1 面向对象(继承多态封装)以及零散概念(组合,property,绑定方法与非绑定方法,反射,内置函数)