9.5 property函数
class Rectangle:
....: def __init__(self):
....: self.width = 0
....: self.height = 0
....: def setSize(self,size):
....: self.width,self.height = size
....: def getSize(self):
....: return self.width,self.height
....:
In [86]: r = Rectangle()
In [87]: r.width = 5
In [88]: r.height
Out[88]: 0
In [89]: r.height = 10
In [90]: r.getSize()
Out[90]: (5, 10)
#!/usr/bin/python
#-*-coding:utf-8-*-
#__metaclass__ = type 或者类为object的子类
class Rectangle(object):
def __init__(self):
self.width = 0
self.height = 0
def setSize(self,size):
self.width,self.height = size
def getSize(self):
return self.width,self.height
size = property(getSize,setSize)
#size = property(getSize) 改成这种方式后,不能进行赋值
r = Rectangle()
r.width = 10
r.height = 5
print r.size
r.size = 150,100
print r.width
静态方法和类成员方法创建是分别被装入Staticmethod类型和Classmethod类型的对象中去。静态方法的定义没有self参数,并能够被类本身直接调用。类方法的定义需要名为cls的类似于self的参数,类成员方法可以直接用类的具体对象调用。但cls参数是自动绑定到类的。
参考:http://www.cnblogs.com/2gua/archive/2012/09/03/2668125.html
一种实现方法
In [117]: class MyClass:
.....: val1 = 'value 1'
.....: def __init__(self):
.....: self.val2 = 'value 2'
.....: def staticmd():
.....: print '静态方法,无法访问val1,val2'
.....: smd = staticmethod(staticmd)
.....: def classmd(cls):
.....: print 'cls function:' + str(cls) + 'val1:' + cls.val1 + ',无法访问val2' .....: cmd = classmethod(classmd)
.....:
In [118]: mc = MyClass()
In [119]: mc.smd
Out[119]: <function __main__.staticmd>
In [120]: mc.smd()
静态方法,无法访问val1,val2
In [121]: mc.cmd()
cls function:<class '__main__.MyClass'>val1:value 1,无法访问val2
In [122]: MyClass.smd()
静态方法,无法访问val1,val2
In [123]: MyClass.cmd()
cls function:<class '__main__.MyClass'>val1:value 1,无法访问val2
第二种实现方式:装饰器
In [125]: class MyClass:
.....: val1 = 'value1'
.....: def __init__(self):
.....: self.val2 = 'value2'
.....: @staticmethod
.....: def staticmd():
.....: print 'static method ,无法访问val val2'
.....: @classmethod
.....: def classmd(cls):
.....: print 'class method ,类:' + str(cls) + ',val: ' + cls.val1 + ', 无法访问val2'
.....:
In [126]: mc = MyClass()
In [127]: mc.staticmd()
static method ,无法访问val val2
In [128]: mc.classmd()
class method ,类:<class '__main__.MyClass'>,val: value1, 无法访问val2
In [129]: MyClass.staticmd()
static method ,无法访问val val2
In [130]: MyClass.classmd()
class method ,类:<class '__main__.MyClass'>,val: value1, 无法访问val2
9.6 迭代器
迭代器的意思是重复做一些事情很多次——就像在循环中做的那样。__iter__方法返回一个迭代器,所谓的迭代器就是具有next方法的对象。在调用next时,迭代器返回下一个值。
#!usr/bin/python
#-*-coding=utf-8-*-
class Fibs:
def __init__(self):
self.a = 0
self.b = 1
def next(self):
self.a,self.b = self.b ,self.a + self.b
return self.a
def __iter__(self):
return self
fibs = Fibs()
for f in fibs:
if f > 1000:
print f
break
内建函数iter也可以从可迭代的对象中获得迭代器。
9.7 生成器
生成器是一种用普通的函数语法定义的迭代器。
#!usr/bin/python
#-*-coding=utf-8-*-
nested = [[1,2],[2,4],[5]]
def flatten(nested):
for sublist in nested:
for element in sublist:
yield element
for num in flatten(nested):
print num
任何包含yield 的函数称为生成器。除了名字之外,它的行为和普通函数也有很大的差别。它不像return那样返回值,而是每次产生多个值。每次产生一个值函数就会被冻结;即函数停在那点等待被激活,函数被激活后从停止的那点开始执行。
生成器推导式和列表推导式工作方式类似,只不过返回的不是列表推导式而是生成器(并且不会立刻进行循环)
In [9]: [x*x for x in range(10)]
Out[9]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
In [10]: g = (x*x for x in range(10))
In [11]: g.next()
Out[11]: 0
In [12]: g.next()
Out[12]: 1
In [13]: g.next()
Out[13]: 4
递归生成器:为了处理更多任意层的嵌套,可以用递归迭代器:
#!usr/bin/python
#-*-coding=utf-8-*-
nested = [[[1,2],[2,4],[5]],[3,[4]]]
def flatten(nested):
try:
#不要迭代类似字符串的对象
try: nested + ''
except TypeError:pass
else: raise TypeError
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
for num in flatten(nested):
print num
生成器方法
生成器的新属性是在运行后为生成器提供值的能力。表现为生成器和“外部世界”进行交流的渠道。
外部作用域访问生成器的send方法,就像访问next方法一样,只不过没有参数。
在内部则挂起生成器,yield现在作为表达式而不是语句使用,换句话说,当生成器重新运行的时候,yield方法返回一个值,也就是外部通过send方法发送的值。如果next方法被使用,那么yield方法返回none
10.1 模块导入并不意味着在导入时执行某些操作,主要是用来定义,比如变量、函数和类等。导入模块多次和一次效果一样。
#!usr/bin/python
#-*-coding=utf-8-*-
#hello4.py
def hello():
print "Hello World!"
def test():
hello()
if __name__ == '__main__':
test()
10.2 探究模块
查看模块包含的内容可以使用dir函数,它会将对象的所有特性列出。
__all__定义了模块的公有接口(public interface)。更准确的说,它告诉解释器:从模块导入所有的名字代表了什么含义。
from copy import * ,只能使用__all__变量中的4个函数。要导入其他函数只能通过显式地实现。导入copy 然后使用copy.PyStringMap,或者使用from copy import PyStringMap.
help获取帮助:help(copy.copy)
文档:pring range.__doc__
使用源代码:print copy.__file__
10.3 标准库
sys模块能够让你访问与python解释器联系紧密的变量和函数。
os提供了访问多个操作系统服务的功能。
os.linesep 用于文本文件的字符串分隔符,unix中为一个还行符(\n),Mac OS中为单个回车符(\r),windows中为两者的组合(\r\n)
打开网页的好方案
In [21]: import webbrowser
In [22]: webbrowser.open('http://www.baidu.com')
Out[22]: True
In [23]: 已在现有的浏览器会话中创建新的窗口。
fileinput 模块能够快速的遍历文本中的所有行。
11.3.4 在需要对一个非常大的文件进行迭代操作时,readlines会占用太多的内存。这个时候可以使用while循环和readline方法进行替代。
文件迭代器:文件迭代器意味着可以直接在for循环中使用他们,从而对他进行迭代。
#!usr/bin/python
#-*-coding = utf-8-*-
#
f = open(r'./test.txt','r')
for line in f:
print(line)
f.close()
15.1 Tidy
Tidy 是用来修复不规范且随意的HTML的工具,它能以相当智能的方法修复一般错误。Tidy不能修复HTML文件的所有问题,但是他能确保文件格式的正确(也就是所有元素都正确嵌套)。
XHTML和旧版HTML之间的最主要的区别是XHTML对于显式关闭所有元素要求更加严格。XHTML的另一个好处是它是XML的一种,所以可以对他使用XML的工具。