魔法方法,属性和迭代器

新式类

通过赋值语句__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魔法方法和迭代器的更多相关文章

  1. Python学习笔记:魔术方法详解

    准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Object): mor_code_here class OldType: ...

  2. python学习笔记之split()方法与with

    Python split()方法 以下内容摘自:http://www.runoob.com/python/att-string-split.html 描述 Python split()通过指定分隔符对 ...

  3. python学习笔记(二)-字符串方法

    python的字符串内建函数: #====================常用方法=============================name = 'besttest' new_name = n ...

  4. Python学习笔记06

      源代码文件第一行添加:#coding:utf-8,这样就可以避免了 或者:#-*- coding: UTF-8 -*-   dict:实际就是哈希表,其键只能是不可变类型,如string,bool ...

  5. python学习笔记之函数(方法)

    def func(x): print 'x is', x x = 2 print 'Changed local x to', x x = 50 func(x) print 'x is still', ...

  6. python学习笔记06:操作文件

    调用内置的open函数打开文件,传递两个参数:文件路径(绝对路径或相对路径),打开模式('r':读,'r+':读写,'w':写,'b':二进制): f = open('data.txt','w') f ...

  7. 【python学习笔记】9.魔法方法、属性和迭代器

    [python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...

  8. Python学习笔记之生成器、迭代器和装饰器

    这篇文章主要介绍 Python 中几个常用的高级特性,用好这几个特性可以让自己的代码更加 Pythonnic 哦 1.生成器 什么是生成器呢?简单来说,在 Python 中一边循环一边计算的机制称为 ...

  9. 【Python学习笔记之二】浅谈Python的yield用法

    在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...

随机推荐

  1. Shader Forge 植物摆动

    前日才赞Shader Forge好用,今天就找到了BUG(1.03 版本) -- 获得顶点在物体空间坐标的方法绕来绕去,transform不支持齐次坐标, 不超过3行的shader代码要我出这么一个宏 ...

  2. SRM 406(1-250pt, 1-500pt)

    DIV1 250pt 题意:有几家宠物店,vecort<int>A表示每家宠物店含有小狗占小狗总数的百分比.现在要做扇形统计图统计每家店的小狗百分比,如下图,问作出来的扇形统计图中最多含有 ...

  3. Eclipse : 找不到或无法加载主类

    问题: 找不到或无法加载主类 解决思路: Step1: 去网上百度了下,基本上都说是环境变量的问题. 原因:环境变量设置有问题. 解决方法:重设环境变量 结果:当然问题没解决. Step2:再次百度, ...

  4. JDBC 之 事务

    1.概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功. 2.数据库开启事务的命令dtl: Start transaction开启事务 Rollback回滚事务(撤销) ...

  5. java+ mysql 给所有的表添加假数据

    需求:别的项目, 代码扣过来了, 数据库也拿过来了, 但是数据库全是空表, 一共700 张表,需求是给表添加假数据,让它能运行起来. 一下是代码实现: 1.数据库连接: public static C ...

  6. lvchange的available參数

    available參数在man info help中均无此參数,事实上參数为:activate 写此此.值得用的人注意. available 參数实为:  -a, --activate [a|e|l] ...

  7. 第一篇:R语言数据可视化概述(基于ggplot2)

    前言 ggplot2是R语言最为强大的作图软件包,强于其自成一派的数据可视化理念.当熟悉了ggplot2的基本套路后,数据可视化工作将变得非常轻松而有条理. 本文主要对ggplot2的可视化理念及开发 ...

  8. Android进阶笔记02:Android 网络请求库的比较及实战(二)

    一.Volley        既然在android2.2之后不建议使用HttpClient,那么有没有一个库是android2.2及以下版本使用HttpClient,而android2.3及以上版本 ...

  9. Android中实现跨app之间数据的暴露与接收

    例如一个小项目:实现单词本的添加单词等功能 功能:不同的方式实现跨app之间数据的暴露与接收 暴露端app:实现单词的添加(Word.Translate),增删改查: 接收端app:模糊查询,得到暴露 ...

  10. instancetype vs id for Objective-C

    instancetype: 使用 instancetype 编译器和IDE 会做类型检查,而id不会做完整的类型检查. A method with a related result type can ...