python魔法方法、构造函数、序列与映射、迭代器、生成器

摘要:
在Python中,all__双下划线包装方法统称为“魔法方法”。对于一个序列,它是元素的数量;对于映射,它是键值对的数量。在现代类中应该使用属性函数而不是访问器方法。迭代列表将占用太多内存。迭代器更加通用,简单而优雅。implementated__iter__方法的对象是迭代的,实现下一个方法的对象就是迭代器。yield语句表示应该生成一个值,return语句表示生成器应该停止执行。生成器由两部分组成:生成器函数和生成器迭代器。

在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法"。比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法。

构造函数

构造函数不同于普通方法,将在对象创建后自动调用它们。也就是在对象创建完成后,自动会调用__init__方法来初始化。

创建一个构造方法

python魔法方法、构造函数、序列与映射、迭代器、生成器第1张

构造方法传参

>>> classFooBar:
    def __init__(self,value=42): #默认参数

        self.somevar =value
>>> f = FooBar('This is a constructor argumnet')
>>>f.somevar
'This is a constructor argumnet'

构造方法的重写

普通方法就不说了,一下是特殊方法的重写方式:

1.调用超类构造方法的未绑定版本;2.使用super函数

(1)调用未绑定的超类构造方法:Bird.__init__(self)

(2)使用super函数 super(SongBird, self).__init__()

当前的类和对象可以作为super函数的参数使用,调用函数返回的对象的任何方法都是调用超类的方法,而不是当前类的方法。也就是说函数super返回的是一个super对象,这个对象为你执行方法解析,当你访问它的属性时,它将在所有的超类中查找,直到找到指定属性或者引发AttributeError异常。通常使用super()函数不提供任何参数方式。

python魔法方法、构造函数、序列与映射、迭代器、生成器第2张

成员访问

基本的序列和映射规则

序列和映射是对象的集合,对象不可变,需使用2个魔法方法;对象可变需使用4个

(1)__len_(self):这个方法返回集合中所含项目的数量。对于序列就是元素的个数;对于映射则是键-值对的数量。

(2)__getitem__(self,key):这个方法返回与所给键对应的值。对于序列:键应该是一个0~n-1的整数,n是序列的长度;对于映射:可以使用任何种类的键。

(3)__setitem__(self,key,value):这个方法按一定的方式存储和key相关的value,该值随后可使用__getitem__来获取。

(4)__delitem__(self,key):对一部分对象使用del语句是被调用,同时必须删除和元素相关的键;可修改对象定义的(并不是删除全部的对象,而只删除一些需要移除的元素)

下面是一个无穷序列的例子:

python魔法方法、构造函数、序列与映射、迭代器、生成器第3张

子类化列表,字典和字符串

python魔法方法、构造函数、序列与映射、迭代器、生成器第4张

特性--property函数

python魔法方法、构造函数、序列与映射、迭代器、生成器第5张

property函数可以用0,1,2,3或者4个参数来调用。

property的4个参数分别被叫做fget,fset,fdel和doc。

没有指定参数创建的特性将不可读写,指定一个参数只读,第三个参数可选,用于删除属性的方法,第四个也是可选,指定一个文档字符串。

在新式类中应该使用property函数而不是访问器方法。

静态方法和类成员方法

静态方法:定义没有self参数,并且能够被类本身直接调用

类成员方法:定义时需要名为cls的类似于self的参数,类成员方法可以直接用类的具体对象调用,cls参数是自动被绑定到类的。

classMyClass:
    defsmeth():
        print('This is a static method')
        smeth =staticmethod(smeth)
    defcmeth(cls):
        print('This is a class method of', cls)
        cmeth = classmethod(cmeth)

装饰器:使用@操作符

>>> classMyClass:
    @staticmethod
    defsmeth():
        print('This is a static method')
    @classmethod
    defcmeth(cls):
        print('This is a class method of',cls)
>>> MyClass.smeth() #静态方法:定义没有self参数,并且能够被类本身直接调用

This isa static method
>>>MyClass.cmeth()
This is a class method of <class '__main__.MyClass'>

__getattr__、__setattr__等

拦截对象的所有特性访问是可能的

魔法方法(可以对处理很多属性的方法进行再编码)

(1)__getattribute__(self,name):当特性name被访问时自动被调用(只能在新式类中使用)

(2)__getattr__(self,name):当特性name被访问且对象没有相应的特性时被自动调用。

(3)__setattr__(self,name,value):当试图给特性name赋值时会被自动调用。

(4)__delattr__(self,name):当试图删除特性name时被自动调用。

python魔法方法、构造函数、序列与映射、迭代器、生成器第6张

特殊方法__dict__,该方法包含一个字典,字典里面是所有实例的属性,为避免__setattr__方法被再次调用(这样程序陷入死循环),__dict__方法被用来代替普通的特性赋值操作。

迭代器

列表会占用太多内存,使用迭代器更通用、简单优雅。

特殊方法:__iter__,这个方法是迭代器规则的基础

__iter__方法返回一个迭代器,它是包含方法__next__的对象,而调用这个方法时可以不提供参数。当调用方法__next__时,迭代器返回其下一个值。如果迭代器没有可提供返回的值,引发StopIteration异常。

实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器。

python魔法方法、构造函数、序列与映射、迭代器、生成器第7张

从迭代器得到序列

使用list构造方法显示地将迭代器转化为列表

>>> classTestIterator:
        value =0
        def __next__(self): #此处是python3.0的版本,3.0以前的版本是用def next(self):

            self.value +=1
            if self.value >10:
                raiseStopIteration
            returnself.value
        def __iter__(self):
            returnself
>>> ti =TestIterator()
>>>list(ti)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

生成器

生成器是一种使用普通函数语法定义的迭代器。

创建生成器(处理两层嵌套)

功能:顺序打印出列表中的数字

python魔法方法、构造函数、序列与映射、迭代器、生成器第8张

生成器与函数的区别在于,生成器不是使用return返回一个值,而是可以生成多个值,每次一个。每次使用yiled生成一个值后,函数都将冻结,停止执行,等待重新被唤醒。被重新唤醒之后,函数将从停止的地方开始继续执行。

递归生成器

如果要处理任意层嵌套的列表,每一层都需要一个for循环,也可以使用递归。

python魔法方法、构造函数、序列与映射、迭代器、生成器第9张

通用生成器

生成器是一个包含yield关键字的函数,当它被调用时,在函数体中的代码不会被执行,而返回一个迭代器。

每次请求一个值,就会执行生成器中的代码,直到遇到一个yield或者return语句。

yield语句意味着应该生成一个值,return语句意味着生成器要停止执行。

生成器由两部分组成:生成器的函数和生成器的迭代器。生成器的函数是用def语句定义的,包含yield的部分。生成器的迭代器是这个函数返回的部分。

python魔法方法、构造函数、序列与映射、迭代器、生成器第10张

生成器的方法

外部作用域访问生成器的send方法

内部则挂器生成器,yield作为表达式而不是语句使用。即当生成器重新运行时,yield返回一个值,通过send从外部世界发送的值。如果使用的是next,yield将返回一个None

>>> defrepeater(value):
        whileTrue:
            new = (yieldvalue)
            if new is notNone:
                value =new
>>> r=repeater(42)
>>>r.next()
42
>>> r.send("Hello, world! ")
'Hello, world! '

免责声明:文章转载自《python魔法方法、构造函数、序列与映射、迭代器、生成器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Go语言基础之数组Java实现旅行商最短距离下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#调用Windows API函数截图

界面如下: 下面放了一个PictureBox 首先是声明函数: 1 //这里是调用 Windows API函数来进行截图 2 //首先导入库文件 3 [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")] 4 5...

Qt 学习之路 2(75):线程总结

前面我们已经详细介绍过有关线程的一些值得注意的事项。现在我们开始对线程做一些总结。 有关线程,你可以做的是: 在QThread子类添加信号。这是绝对安全的,并且也是正确的(前面我们已经详细介绍过,发送者的线程依附性没有关系) 不应该做的是: 调用moveToThread(this)函数 指定连接类型:这通常意味着你正在做错误的事情,比如将QThread控...

Python图像处理 PIL中convert('L')函数原理

1. img = img.convert()   PIL有九种不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。 1.1 img.convert('1')   为二值图像,非黑即白。每个像素用8个bit表示,0表示黑,255表示白。 1.1.1 Code 1 from PIL import Image 2 3 4 def conv...

python连接服务器上传文件,后台执行命令

上传文件 import osimport paramikoimport loggingfrom django.core.cache import cachefrom YunTai import settings def upload_files(connectIp): ssh = paramiko.Transport((connectIp, 22...

python+Django CRM客户关系管理系统开发(七)--修改功能开发

一、本节目标 前几节完成了admin功能首页,数据展示,过滤,搜索,排序,分页等功能。本节开发修改数据功能。 二、功能分析 1、admin的实现方法是,(1)、点击第一列的数据,(2)、然后跳转到修改页面,链接中增加了对象的id 三、功能开发 1、我们也仿照admin的方法,给第一列添加一个超链接。 admin是根据这个对象的id来确定是哪个修改的...

python爬取网易翻译 和MD5加密

一、程序需要知识 1、python中随机数的生成 #生成 0 ~ 9 之间的随机数 #导入 random(随机数) 模块 importrandom print(random.randint(0,9)) 2、python获取当前时间和时间戳 importtime,datetime #时间戳 print(time.time()) #今天的日期 prin...