Python学习笔记:06魔法方法和迭代器
魔法方法,属性和迭代器
新式类
通过赋值语句__metaclass=true或者class NewStyle(object)继承内建类object,可以表明是新式类。
构造方法
对象被创建后,会立即调用的构造方法
class Foobar:
def __init__(self,value=42):
self.somevar=value
fb=Foobar()
print fb.somevar
42
重写
通过重写超类的方法,可以自定义继承的行为
class A(object):
def __init__(self):
self.name='default'
def greet(self):
print 'I am A' ,self.name
class B(A):
def __init__(self):
super(B, self).__init__()
def greet(self):
print 'I am B' ,self.name
a=A()
a.greet()
b=B()
b.greet()
I am A default
I am B default
基本的序列和映射规则
通过定义规则中的方法,可以像序列一样访问对象
__len__
__getitem__
__setitem__
__delitem__
class squares(object):
def __getitem__(self,key):
return key*key
s=squares()
s[5]
25
property函数
通过property函数虚拟出新的属性
class Rect(object):
def __init__(self):
self.w=0
self.h=0
def setSize(self,size):
self.w,self.h=size
def getSize(self):
return self.w,self.h
size=property(getSize,setSize)
rec=Rect()
rec.size= (10,20)
print rec.size
(10, 20)
静态方法和类成员方法
__metalclass__ = type
class MyClass(object):
@staticmethod
def smeth():
print 'this is a static method'
@classmethod
def cmeth(cls):
print 'this is a class method', cls
MyClass.smeth()
MyClass.cmeth()
this is a static method
this is a class method <class '__main__.MyClass'>
属性魔法函数__getattr__
在访问特性的时候回执行getattr方法
__metaclass__ = type
class Rect:
def __init__(self):
self.width=0
self.height=0
def __getattr__(self,name):
if name=='size':
return self.width,self.height
rect=Rect()
rect.size
(0, 0)
迭代器
__metaclass__ = type
class Fibs:
def __init__(self):
self.a=0
self.b=1
def next(self):
self.a,self.b=self.b,self.a+self.b
if self.b >100:
raise StopIteration
return self.b
def __iter__(self):
return self;
fib=Fibs()
for f in fib:
if f > 1000:
break
print f
1
2
3
5
8
13
21
34
55
89
fib=Fibs()
lf=list(fib)
lf
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
生成器
生成器是一种用普通函数语法定义的迭代器。函数每次执行到yield时就冻结,然后等待下一次访问时继续执行到下一个yield
def myYield():
for i in range(5):
yield i
m=myYield()
type(m)
generator
list(m)
[0, 1, 2, 3, 4]
m2=myYield()
for i in m2:
print i
0
1
2
3
4
myYield
<function __main__.myYield>
send函数,外部向生成器发送消息
def repeater(value):
while True:
new = (yield value)
if new is not None: value = new
r=repeater(42)
r.next()
42
r.next()
42
r.send(100)
100
r.next()
100
Python学习笔记:06魔法方法和迭代器的更多相关文章
- Python学习笔记:魔术方法详解
准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Object): mor_code_here class OldType: ...
- python学习笔记之split()方法与with
Python split()方法 以下内容摘自:http://www.runoob.com/python/att-string-split.html 描述 Python split()通过指定分隔符对 ...
- python学习笔记(二)-字符串方法
python的字符串内建函数: #====================常用方法=============================name = 'besttest' new_name = n ...
- Python学习笔记06
源代码文件第一行添加:#coding:utf-8,这样就可以避免了 或者:#-*- coding: UTF-8 -*- dict:实际就是哈希表,其键只能是不可变类型,如string,bool ...
- python学习笔记之函数(方法)
def func(x): print 'x is', x x = 2 print 'Changed local x to', x x = 50 func(x) print 'x is still', ...
- python学习笔记06:操作文件
调用内置的open函数打开文件,传递两个参数:文件路径(绝对路径或相对路径),打开模式('r':读,'r+':读写,'w':写,'b':二进制): f = open('data.txt','w') f ...
- 【python学习笔记】9.魔法方法、属性和迭代器
[python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...
- Python学习笔记之生成器、迭代器和装饰器
这篇文章主要介绍 Python 中几个常用的高级特性,用好这几个特性可以让自己的代码更加 Pythonnic 哦 1.生成器 什么是生成器呢?简单来说,在 Python 中一边循环一边计算的机制称为 ...
- 【Python学习笔记之二】浅谈Python的yield用法
在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...
随机推荐
- 更新一波题解(最近做的三个dp题)
很久没写题解了,去ec之前来填一填坑,希望能攒攒人品... 首先是去年上海F题..uvalive7143 题意: 给n个人分 m间房子,每个房间的容量是已知的,其中有k对双胞胎,双胞胎可以看作相同的人 ...
- Codeforces Round #259 (Div. 2) D. Little Pony and Harmony Chest 状压DP
D. Little Pony and Harmony Chest Princess Twilight went to Celestia and Luna's old castle to resea ...
- xp多网卡静态路由设置方法
xp多网卡静态路由设置方法 一.多个IP都在同一网段或VALN.这类情况没什么好说的,在各块网卡的本地连接属性里设置好IP地址.子网掩码和默认网关即可. 二.多个IP属于不同网段或VLAN.这时如果按 ...
- windows下python安装paramiko
Python中使用SSH需要用到OpenSSH,而OpenSSH依赖于paramiko模块,而paramiko模块又依赖于pycrypto模块,因此要在Python中使用SSH,则需要先安装模块顺序是 ...
- readlink
readlink命令 标签: ubuntulinux工具file 2012-03-15 14:06 3674人阅读 评论(1) 收藏 举报 分类: linux系统(184) C语言(92) re ...
- Django admin进阶
1. ModelAdmin.inlines 将有外键的子类包含进视图 ,实例: class Author(models.Model): name = models.CharField(max_leng ...
- 缓存管理Memorycache 的使用
前言:什么是memoryCache? 一种缓存管理技术,某些只读数据频繁操作数据库,会对系统的性能有很大的开销,所以我们使用缓存技术,当数据库内容更新,我们在更更新缓存的数据值.目前缓存讲技术的产 ...
- android 自定义Toast显示风格
1.创建一个自己想要显示Toast风格的XML如下代码(toast_xml.xml): <?xml version="1.0" encoding="utf-8&qu ...
- Eclipse用法和技巧二十四:当git遇上eclipse
git是非常优秀的代码管理工具,eclipse是非常不错的,免费的IDE.工作中两者碰到一起,有点麻烦了:eclipse对于每个项目会生成一些特定的文件,而这些文件又不是项目必须的,并且每个人的配置是 ...
- 【PHP缩略图类】手机照片不能生成缩略图问题以及解决方式
[本文原创,谢绝转载] 一.出现的问题 这几天做了手机上传照片并裁出缩略图的接口的測试,发现无论怎么.生成的缩略图都是一片漆黑.:-( 然后就把这个缩略图类单拿出来进行測试,发现仅仅要是手机拍出来的照 ...