博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python进阶-面向对象编程五:类的内置方法
阅读量:7052 次
发布时间:2019-06-28

本文共 3262 字,大约阅读时间需要 10 分钟。

 类的使用本质是调用类的内置方法

 __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']=18f['age1']=19print(f['age'])print(f.age1)del f.age1del f['age']print(f.__dict__)

# 内置方法:__slots__ 

#使用类.xxx,或者对象.xxx,来访问属性本质就是在访问类或者对象的__dict__属性字典(类的字典是共享的,而每个实例的字典是独立的)#字典会占用大量的内存,如果有一个属性很少的类,但是实例很多的类,用__slots__来代替__dict__,限制对象属性数量,# 对所有对象属性统一管理,#节省内存.缺点是不能再给实例添加新属性,只能用里面有的。class People:    __slots__ = ['x','y','z']p=People()p.x=10p.y=20p.z=30print(p.x,p.y,p.z)

 

#实现迭代器协议的内置方法:__iter__,__next__

#实现迭代器协议的内置方法:__iter__,__next__from collections import Iterable,Iteratorclass Foo:    def __init__(self,start):        self.start=start    def __iter__(self):        return self    def __next__(self):        n=self.start        self.start+=1        return nf=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 nfor 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 timeclass 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):    #     passp=People("ada")print(callable(People))#Trueprint(callable(p))#False,然而放开注释就是True

 

转载于:https://www.cnblogs.com/adamans/articles/7517506.html

你可能感兴趣的文章
Winform动态创建控件对DPI的处理
查看>>
new关键字与malloc的区别
查看>>
《Just For Fun》阅读摘抄
查看>>
hibernate4.3.5.Final入门1
查看>>
python 发送邮件模块
查看>>
unqlite安装/使用/测试
查看>>
SQLite 查询或更新上一条插入的数据
查看>>
Ansible 之 roles使用
查看>>
我的友情链接
查看>>
OpenCV+Dlib进行实时脸部检测
查看>>
【Android】简单的日志工具
查看>>
8月初.wang域名总量TOP14:35互联耐思尼克竞争激烈
查看>>
解决wordpress上传文件2M限制
查看>>
读《学习正则表达式》(1)
查看>>
482. License Key Formatting - LeetCode
查看>>
AWK常用命令总结
查看>>
Webkit浏览器点击控件时出现的边框消除
查看>>
python Redis 手册 翻译
查看>>
rm命令删除的文件或目录放入垃圾箱
查看>>
我的友情链接
查看>>