python魔法方法、构造函数、序列与映射、迭代器、生成器
在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法"。比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法。
构造函数
构造函数不同于普通方法,将在对象创建后自动调用它们。也就是在对象创建完成后,自动会调用__init__方法来初始化。
创建一个构造方法

构造方法传参
>>> class FooBar:
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()函数不提供任何参数方式。

成员访问
基本的序列和映射规则
序列和映射是对象的集合,对象不可变,需使用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语句是被调用,同时必须删除和元素相关的键;可修改对象定义的(并不是删除全部的对象,而只删除一些需要移除的元素)
下面是一个无穷序列的例子:

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

特性--property函数

property函数可以用0,1,2,3或者4个参数来调用。
property的4个参数分别被叫做fget,fset,fdel和doc。
没有指定参数创建的特性将不可读写,指定一个参数只读,第三个参数可选,用于删除属性的方法,第四个也是可选,指定一个文档字符串。
在新式类中应该使用property函数而不是访问器方法。
静态方法和类成员方法
静态方法:定义没有self参数,并且能够被类本身直接调用
类成员方法:定义时需要名为cls的类似于self的参数,类成员方法可以直接用类的具体对象调用,cls参数是自动被绑定到类的。
class MyClass:
def smeth():
print('This is a static method')
smeth = staticmethod(smeth)
def cmeth(cls):
print('This is a class method of', cls)
cmeth = classmethod(cmeth)
装饰器:使用@操作符
>>> class MyClass:
@staticmethod
def smeth():
print('This is a static method')
@classmethod
def cmeth(cls):
print('This is a class method of',cls)
>>> MyClass.smeth() #静态方法:定义没有self参数,并且能够被类本身直接调用
This is a 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时被自动调用。

特殊方法__dict__,该方法包含一个字典,字典里面是所有实例的属性,为避免__setattr__方法被再次调用(这样程序陷入死循环),__dict__方法被用来代替普通的特性赋值操作。
迭代器
列表会占用太多内存,使用迭代器更通用、简单优雅。
特殊方法:__iter__,这个方法是迭代器规则的基础
__iter__方法返回一个迭代器,它是包含方法__next__的对象,而调用这个方法时可以不提供参数。当调用方法__next__时,迭代器返回其下一个值。如果迭代器没有可提供返回的值,引发StopIteration异常。
实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器。

从迭代器得到序列
使用list构造方法显示地将迭代器转化为列表
>>> class TestIterator:
value = 0
def __next__(self): #此处是python3.0的版本,3.0以前的版本是用def next(self):
self.value +=1
if self.value >10:
raise StopIteration
return self.value
def __iter__(self):
return self
>>> ti = TestIterator()
>>> list(ti)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
生成器
生成器是一种使用普通函数语法定义的迭代器。
创建生成器(处理两层嵌套)
功能:顺序打印出列表中的数字

生成器与函数的区别在于,生成器不是使用return返回一个值,而是可以生成多个值,每次一个。每次使用yiled生成一个值后,函数都将冻结,停止执行,等待重新被唤醒。被重新唤醒之后,函数将从停止的地方开始继续执行。
递归生成器
如果要处理任意层嵌套的列表,每一层都需要一个for循环,也可以使用递归。

通用生成器
生成器是一个包含yield关键字的函数,当它被调用时,在函数体中的代码不会被执行,而返回一个迭代器。
每次请求一个值,就会执行生成器中的代码,直到遇到一个yield或者return语句。
yield语句意味着应该生成一个值,return语句意味着生成器要停止执行。
生成器由两部分组成:生成器的函数和生成器的迭代器。生成器的函数是用def语句定义的,包含yield的部分。生成器的迭代器是这个函数返回的部分。

生成器的方法
外部作用域访问生成器的send方法
内部则挂器生成器,yield作为表达式而不是语句使用。即当生成器重新运行时,yield返回一个值,通过send从外部世界发送的值。如果使用的是next,yield将返回一个None
>>> def repeater(value):
while True:
new = (yield value)
if new is not None:
value = new
>>> r=repeater(42)
>>> r.next()
42
>>> r.send("Hello, world! ")
'Hello, world! '
python魔法方法、构造函数、序列与映射、迭代器、生成器的更多相关文章
- python魔法方法-自定义序列
自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python ...
- python魔法方法-自定义序列详解
自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python ...
- 1. Python 魔法方法
Python 魔法方法 基础: 如果你想... 所以,你写... Python调用... 初始化一个实例 x = MyClass() x.__init__() 作为一个字符串的"官方&quo ...
- Python魔法方法总结及注意事项
1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...
- python魔法方法:__getattr__,__setattr__,__getattribute__
python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...
- python魔法方法大全
1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...
- python 魔法方法补充(__setattr__,__getattr__,__getattribute__)
python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...
- with上下文管理 python魔法方法
with语法在Python里很常见, 主要的利好是使用代码更简洁. 常见的使用场景有: 1. 资源对象的获取与释放. 使用with可以简化try...finally ... 2. 在不修改函数代码的前 ...
- python 魔法方法诠释
什么是Python魔法方法 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的(比如 ini ...
随机推荐
- Android为TV端助力 android 在5.0以后不允许使用隐式Intent方式来启动Service
android5.0以后不能使用隐式intent :需要指定Intent的ComponentName信息:intent.setComponent(xxx),或指定Intent的setPackage(& ...
- Android为TV端助力 关于JNI的使用方法
1首先在java里面定义你需要的native方法 2打开cmd,进入doc窗口,如果是android项目就进入到你当前项目的bin目录下,在doc里面输入cd E:\workspace\Test1 也 ...
- 通过git上传本地代码到github仓库
最近呢,武汉天气燥热,在公司没啥事,就自己写了一下小demo. 作为一个菜鸟,只在github上扒过别人的代码,还没自己上传过,就试了一下,遇到了一些坑,记录一下. 前提是电脑上安装了git,没有安装 ...
- CentOS基本的命令与快捷建
由于我的计算机在安装linux系统时,计算机出现了问题,并没有安装ubuntu而是安装的centos.虽然两者属于linux的不同版本,但是在具体的操作上大同小异.在学习linux的各种指令和快捷键的 ...
- ERP承接新后台优惠规则问题
一.后台在哪配置优惠规则? 1.设置优惠时间段: 2.添加优惠活动: 关于自动和手动: 自动:创建后,ERP同步数据后即生效. 点餐,活动会自动生效,自动计算金额. 手动:创建后,ERP需要手 ...
- 洗礼灵魂,修炼python(75)--全栈项目实战篇(3)—— 账户注册登录管理系统
要求: 1.系统可以创建用户和登录用户,根据用户的输入不同,做出不同的反应(创建还是登录) 2.创建用户不能创建已存在的用户名 3.登录用户的操作最多只能有三次,超过三次冻结账户,每使用一次提示用户还 ...
- vmware中连接U盘
1.首先安装VMware tools. 2.然后根据这篇经验操作 https://jingyan.baidu.com/article/7c6fb42828806480652c9062.html 3. ...
- [Hive_9] Hive 的排序
0. 说明 全排序(order by) | 部分排序(sort by) | hash 分区(distribute by) | cluster by 1. 前期准备 1.1 建表 create tab ...
- puppet 横向扩展(二)
Table of Contents 1. 概述 2. 实验环境 3. 实验步骤 3.1. 机器B 的环境 3.1.1. 安装puppetmaster 以及 apache passenger 3.1.2 ...
- 【2018.08.19 C与C++基础】编程语言类型系统简介(草稿)
还是先占坑,等理顺了思路再写,学过的东西总是无法系统化,感觉什么都知道一点,但一深入却是一脸懵逼. 这真的是个问题,看似很努力,却无法成为一个master. 参考链接: 1. 编程语言的类型系统为何如 ...