类的使用本质是调用类的内置方法
__getitem__, __setitem__,__delitem__,__delattr__
# __getitem__, __setitem__,__delitem__,__delattr__
# 对象的属性进行获取、修改、删除时候触发的内置方法
class Foo:
def __init__(self,name):
self.name=name
def __getitem__(self, item):
print(self.__dict__[item])
def __setitem__(self, key, value):
self.__dict__[key]=value
def __delitem__(self, key):
print('del obj[key]时,我执行')
self.__dict__.pop(key)
def __delattr__(self, item):
print('del obj.key时,我执行')
self.__dict__.pop(item)
f=Foo("adamander")
print(f.name)
print(f['name'])
f['age']=18
f['age1']=19
print(f['age'])
print(f.age1)
del f.age1
del f['age']
print(f.__dict__)
# 内置方法:__slots__
#使用类.xxx,或者对象.xxx,来访问属性本质就是在访问类或者对象的__dict__属性字典(类的字典是共享的,而每个实例的字典是独立的)
#字典会占用大量的内存,如果有一个属性很少的类,但是实例很多的类,用__slots__来代替__dict__,限制对象属性数量,
# 对所有对象属性统一管理,
#节省内存.缺点是不能再给实例添加新属性,只能用里面有的。
class People:
__slots__ = ['x','y','z']
p=People()
p.x=10
p.y=20
p.z=30
print(p.x,p.y,p.z)
#实现迭代器协议的内置方法:__iter__,__next__
#实现迭代器协议的内置方法:__iter__,__next__
from collections import Iterable,Iterator
class Foo:
def __init__(self,start):
self.start=start
def __iter__(self):
return self
def __next__(self):
n=self.start
self.start+=1
return n
f=Foo(0)
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
#一直不停的往下加
# for i in f:
# print(i)
print("************************")
# 实现range类,__next__进行StopIteration处理
# 实现range类,__next__进行StopIteration处理
class Range:
def __init__(self,start,end):
self.start=start
self.end=end
def __iter__(self):
return self
def __next__(self):
if self.start==self.end:
raise StopIteration
n=self.start
self.start+=1
return n
for i in Range(3, 8):
print(i)
# r=Range(3,11)
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
析构方法___del__
# 析构方法___del__析构方法,当对象在内存中被释放时,自动触发执行。
# 注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,
# 因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
#垃圾回收机制,del 立即删除,不然等其他执行完毕,自动回收
import time
class Open:
def __init__(self,filename,mode='r',encoding='utf-8'):
self.file=open(filename,mode,encoding=encoding)
def __enter__(self):
print("enter=====>")
return self
def write(self,line):
t=time.strftime('%Y-%m-%d %T')
self.file.write('%s %s' %(t,line))
def __getattr__(self, item):
return getattr(self.file,item)
def __del__(self):
print("===>del")
def __exit__(self, exc_type, exc_val, exc_tb):
# print("exit")
# print("exc_type",exc_type)
# print("exc_val",exc_val)
# print("exc_tb",exc_tb)
self.file.close()
with Open('b.txt','w+') as f:
f.write("xxxx")
f.write("xxxx")
f.write("xxxx")
# __call__实例调用
# __call__实例调用
# __call__实例调用,没有他,实例是不可调用的
class People:
def __init__(self,name):
self.name=name
# def __call__(self, *args, **kwargs):
# pass
p=People("ada")
print(callable(People))
#True
print(callable(p))
#False,然而放开注释就是True