object_funs.py
#__init__ 构造方法,双下划线 #__del__ 析构方法,在对象就要被垃圾回收前调用。但发生调用 #的具体时间是不可知的。所以建议尽量避免使用__del__ print('-------example1') class A:def __init__(self):self.a='a'def printA(self):print(self.a) class B(A):def __init__(self):#A.__init__(self) 未绑定方法,自由提供self参数#super(B, self).__init__()self.b='b'def printB(self):print(self.b) b=B() try:b.printA() #注释后,没有.a属性 except Exception as e:print(e) #B继承A后,构造方法覆盖了A的构造方法,所以b.printA()没有self.a的属性。 #旧版python 方法:加上注释的未绑定方法就好 #新式类方法:注释的super 方法。先继承会覆盖后继承 print('-------example2') class A:def __init__(self):self.chr='a'def printA(self):print(self.chr) class AA: #继承没有def __init__(self):A.__init__(self) #未绑定方法def printAA(self):print(self.chr) aa=AA() aa.printAA() #得到 a (不继承A也可以调用A的构造函数?要用printA就要继承) print('-------example3') #super 的多继承 #即使类已经继承多个超类,它也只需要使用一次super函数(但要保证所有的超类的构造方法都使用了super) #super(TYPE, self).method调用的是mro列表中第一个,也即继承列表第一个类的方法。这个没有举例 class A:def __init__(self):self.a='a'def printA(self):print(self.a) class B:def __init__(self):self.b='b'def printB(self):print(self.b) class C(A,B):def __init__(self):super(C,self).__init__()self.c='c'def printC(self):print(self.c)c=C() c.printA() try:c.printB() #报错,没有.b属性 except Exception as e:print(e) #解决方法,在所有超类里使用super。只在B中使用super还是不行 class A:def __init__(self):super(A, self).__init__()self.a='a'def printA(self):print(self.a) class B:def __init__(self):super(B, self).__init__()self.b='b'def printB(self):print(self.b) class C(A,B):def __init__(self):super(C,self).__init__()self.c='c'def printC(self):print(self.c)print('-------example4') #实现序列,映射 #__len__(self), __getitem__(self,key), __setitem__(self,key,value), __delitem__(self,key) #定义后相应用len(obj),obj[key],obj[key]=value,del obj[key] #当为一个序列,key键应该是一个整数(自己写函数检查)。对映射,可以使用任何种类的键。例子P144 #继承标准库的UserList,UserString,UserDict的上面方法 class CountList(list):def __init__(self,*args):super(CountList,self).__init__(*args)self.count=0def __getitem__(self,index):self.count+=1return super(CountList,self).__getitem__(index)c=CountList(range(10)) c.reverse() print(c) del c[3:5] print(c) print(c.count) print(c[2]+c[5]) print(c.count)print('-------example5') #property函数,统一处理类的多个属性,实现get,set,del操作。不需要为每一个属性写一个处理方法了 #绑定del 函数,可以使用 del t.all 语句 class Test:def __init__(self):self.a=0self.b=0def setAll(self, size):self.a, self.b=sizedef getAll(self):return self.a, self.ball=property(getAll,setAll) #property中函数setAll的参数size#要与property返回的all一样是一个元组 t=Test() t.all=1,2 #只有property 中绑定了setAll函数才可以赋值 print(t.all) print(t.a)print('-------example6') #静态方法staticmethod,类成员方法classmethod class A:@staticmethoddef smethod():print('smethod')def cmethod(cls):print('classmethod') A.smethod() A.cmethod(A) #这里有问题, 需要有时间查资料print('-------example7') #__getattribute__(self,name) __getattr__(self,name)__ #__setattr__(self,name,value) __delattr__(self,name)__ P151 #__getattribute__特殊方法,用于查询任意属性。 #__getattr__只能用来查询不在__dict__系统中的属性 #定义__getattribute__后,命令行输入a.后,不会有a的属性、方法的提示了 #定义__getattr__ 不会有这种情况 #当我们查询一个属性时,如果通过__dict__方法无法找到该属性, #那么Python会调用对象的__getattr__方法,来即时生成该属性 class A:def __init__(self):self.a=0self.b=0def __setattr__(self,name,value):if name=='size':self.a,self.b=valueelse:#这里换成self.name=value时,a=A()为什么会死循环self.__dict__[name]=value def __getattr__(self,name):if name=='size':return self.a,self.belse:raise AttributeError a=A() a.size=1,2 a.size try:a.c except Exception as e:print(e) #拓展1 setattr(a,'d',3) print(a.__dict__) #多了变量d delattr(a,'d') print(a.__dict__) #少了变量d print('-------example8') #拓展2 class C(object): a = 'abc' def __getattribute__(self, *args, **kwargs): print("__getattribute__() is called") return object.__getattribute__(self, *args, **kwargs) def __getattr__(self, name): print("__getattr__() is called ") return name + " from getattr" def __get__(self, instance, owner): print("__get__() is called", instance, owner) return self def foo(self, x): print(x) class C2(object): d = C() c = C() c2 = C2() c.a #__getattribute__() is called c.zzzzzz #__getattribute__() is called, __getattr__() is called c2.d #__get__() is called <__main__.C2 object at 0x026AAB30> <class '__main__.C2'>#<__main__.C object at 0x026AAAB0> c2.d.a #__get__() is called <__main__.C2 object at 0x026AAB30> <class '__main__.C2'>#__getattribute__() is called #每次通过实例访问属性,都会经过__getattribute__函数。而当属性不存在时, #仍然需要访问__getattribute__,不过接着要访问__getattr__。这就好像是一个异常处理函数。 #每次访问descriptor(即实现了__get__的类),都会先经过__get__函数。 #object.__get__(self, instance, owner) #如果class定义了它,则这个class就可以称为descriptor。 #owner是所有者的类,instance是访问descriptor的实例,如果不是通过实例访问, #而是通过类访问的话,instance则为None。 #(descriptor的实例自己访问自己是不会触发__get__,而会触发__call__, #只有descriptor作为其它类的属性才有意义。)(所以下文的d是作为C2的一个属性被调用) print('-------example9')#自己问题例子 class Test:def __init__(self):self.a=0self.b=0def setAll(self, size):self.a, self.b=sizedef getAll(self):return self.a, self.bdef __getattribute__(self,name):if name=='size1':return self.a,self.belif name=='a':#return self.a #加上这句,调用t.a 就会死循环,这个一直进入自己#return self.__dict__['a'] #报'NoneType' object is not subscriptableprint('a visited')return object.__getattribute__(self,name)#加这句可以elif name=='b':print('b visited')def __getattr__(self,name):if name=='size2':print('size2 visited')return self.a,self.belse:raise AttributeErrordef __setattr__(self, name, value):if name=='a':print('a is changed')elif name=='b':print('b is changed')elif name=='all':print('all changed')all=property(getAll,setAll) t=Test() try:t.getAll() #出错,NoneType object is not callable, setAll也是这个错。#__getattribute__加上return后不会有问题 except Exception as e:print(e)try:t.size1 #为什么返回None, None。因为__getattribute__在访问a,b时没有返回a,b的值 except Exception as e:print(e) print('-------example10')#__dict__属性 #__dict__分层存储属性。每一层的__dict__只存储该层新增的属性。 #子类不需要重复存储父类中的属性。 class bird(object):'__doc__ test'feather = True class chicken(bird):fly = Falsedef __init__(self, age):self.age = age summer=chicken(2) print(bird.__dict__) print(chicken.__dict__) print(summer.__dict__) print(summer.__dict__['age']) b=bird() print(b.__dict__) #这个是空{} feather属性存储在bird.__dict__中print('-------example11') #迭代器,实现__iter__(返回一个迭代器)和__next__方法 #如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常 class Fibs:def __init__(self):self.a=0self.b=1def __next__(self):self.a,self.b=self.b,self.a+self.breturn self.adef __iter__(self):return self fibs=Fibs() for f in fibs:if f>1000:print(f)break#从可迭代对象中获得迭代器 it=iter([1,2]) print(it.__next__()) #1 print(it.__next__()) #2 try:print(it.__next__()) #StopIteration except Exception as e:print(e)#把迭代器转换成序列 class Test():value=0def __next__(self):self.value+=1if self.value>10:raise StopIteration # return self.valuedef __iter__(self):return self t=Test() print(list(t)) # print('-------example12') #生成器,用函数语法定义的迭代器。任何包含yield语句的函数称为生成器 #他不是像return那样返回值,而是每次产生多个值 #生成器方法:send,throw,close #在生成器close方法被调用后再通过生成器生成一个值会导致RuntimeError def repe(value):for i in value:yield i value=[i*2 for i in range(10)] print(value) #0~18 r=repe(value) try:print(r.send('a')) #TypeError: can't send non-None value to a just-started generator except Exception as e:print(e) print(r.__next__()) #r.send(None) 返回0,第一个数 print(r.send('a')) #返回2,第2个数 for i in r:print(i) #从第3个数4开始到结束 try :print(r.send('a')) #报错,StopIteration except Exception as e:print(e)#生成器推导式,返回的不是列表而是生成器 g=(i*2 for i in range(2,10)) #圆括号,不是方括号 print(g.__next__()) #4#send方法 #只有在生成器挂起后才有意义(也就是说在yield第一次被执行后)。即调用一次next__后 #如果真想对刚刚启动的生成器使用send方法,可以将None作为参数进行调用 def repe(value):while True:yield value r=repe(4) print(r.send(None)) #返回4 print(r.send('a')) #返回4def repe(value):while True:new=yield valueprint('new:',new,'value:',value)if new is not None:value=new r=repe(4) print(r.send(None)) #返回4 print(r.send('a')) #返回a new=a,value=4 print(r.send('aa')) #返回aa new=aa,value=a
转载于:https://www.cnblogs.com/feifeidxl/p/5617895.html
object_funs.py相关推荐
- 汉字的首拼音字母生成
生成助记码(取汉字的第一个字母) SET NOCOUNT ON GO IF EXISTS(SELECT name FROM sysobjects WHERE name = N'hzp ...
- 解决 win10 pycurl安装出错 Command python setup.py egg_info failed with error code 10 编译安装包 安装万金油...
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yexiaohhjk/article/d ...
- SyntaxError: Non-ASCII character ‘\xe5‘ in file(xxlrt_1.py) on line 7, but no encoding declared;
具体报错如下: SyntaxError: Non-ASCII character '\xe5' in file /home/hly/work/python/work/xlrt_1.py on line ...
- cygwin执行.py提示找不到模块,但已经安装模块的解决办法
. 在解决了cygwin中make命令不能使用的问题之后(https://www.cnblogs.com/zhenggege/p/10724122.html),make maskrcnn路径下的set ...
- django系列 1 :python+django环境搭建 +mac提示找不到manage.py命令
1.安装python3 2.设置python3的环境变量 3.进入命令行模式,输入 pip install django 1.10.3 4.验证是否安装完成 pip show django 5.dja ...
- svn官方备份hot-backup.py强烈推荐
Author:牛班图 Date:2016/05/18 Address:suzhou --- centos 6.7默认安装的python是2.6.6,大家可以先查看一下自己操作系统的python版本,p ...
- python 一张图画多条线_Gnuplot.py在一张图上绘制多条线
我目前正试图使用gnuplot py从文本文件中绘制多行.我可以分别绘制两条线,但当我试图在同一个图上绘制它们时,它只绘制一条线.在 这是我的代码:#!/usr/bin/env python impo ...
- python中init和setup有什么区别_python – 为什么setup.py在安装期间运行模块__init__.py?...
我正在使用setup.py安装包: python setup.py install 我正在安装的软件包中的__init__.py包含一些软件包级别检查,其中一个检查settings.py中是否有可用的 ...
- keras 的 example 文件 pretrained_word_embeddings.py 解析
该代码演示了 采用预定义的词向量 来进行文本分类的功能. 数据集采用的是 20_newsgroup,18000篇新闻文章,一共涉及到20种话题,训练神经网络,给定一个新闻,可以识别出是属于哪一类的新闻 ...
最新文章
- html5 data url,HTML5 / Javascript – DataURL到Blob和Blob到DataURL
- Linux下sqlite3乱码,sqlite中文乱码问题原因分析及解决
- 双向循环神经网络_情感分析:基于循环神经网络
- branch prediction
- (摘要)100个伟大的商业理念:理念34:企业社会责任
- 下列哪个不是it行业技术岗位_28岁毕业进入IT互联网行业从事技术研发岗位是否还来得及...
- C++基础07-类之静态成员变量和成员函数
- python通信原理_用python通过原始套接字发送scapy包
- sae php 当前路径,SAE上使用自定义环境运行异步任务
- Cisco PPPOE配置详解
- mysql 复制表结构和表数据
- C语言学习——bsmap-2.74_main.cpp
- Java开发笔记(一百二十九)Swing的输入框
- DoubleArrayTrie详解
- win10 无法安装Hp1020和HP1106打印机问题
- sort函数的用法(C++排序库函数的调用)对数组进行排序,在c++中有库函数帮我们实现,这们就不需要我们自己来编程进行排序了。
- ntohs, ntohl, htons,htonl inet_aton等详解
- Android音乐播放器开发(3)—注册
- 爱分析访谈阿博茨CEO杨永智:从感知到认知,阿博茨用AI解放金融民工
- 基于Gabor滤波器的人脸特征提取
热门文章
- C语言“正则表达式”字符串处理sscanf(),使用前缀技巧、匹配邮箱等
- android魅族手机Pro6 Android7.1.1 点击状态栏滚到顶部Bug
- java p2p文件传输_基于java的p2p实现文件共享和传输
- 查询mysql日志存储位置_查看mysql日志存放地点
- overlay与underlay
- (三)基础代谢率bmr的计算4.0-----异常处理机制
- 投票服务器维护时间,梦幻西游《维护解读》108:“春心萌动”大赛投票开启,门派调整部分服务器开测...
- 计算机所选区域单元格数值,计算机习题110、 在Excel工作表的单元格区域A1:A8各单元格中均存放数值1,单元格A9为空,单元格A10为一字符...
- 东芝笔记本Satellite M40-A
- Fikker CDN 主控安装说明