一、类(PT第九章)
9.3.4 方法对象
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
xf = x.f
while True:
print xf()
方法的特别之处在于实例对象被作为函数的第一个参数传给了函数。在我们的示例中,调用x.f()完全等同于MyClass.f(x)。一般情况下,以n
个参数的列表调用一个方法就相当于将方法所属的对象插入到列表的第一个参数的前面,然后以新的列表调用相应的函数。如果你还是不明白方法的工作原理,了解一下它的实现或许有帮助。引用非数据属性的实例属性时,会搜索它的类。如果这个命名确认为一个有效的类属性即函数对象,就会将实例对象和函数对象封装进一个抽象对象:这就是方法对象。以一个参数列表调用方法对象时,它被重新拆封,用实例对象和原始的参数列表构造一个新的参数列表,然后以这个新的参数列表调用对应的函数对象。
9.3.5 类和实例变量
一般来说,实例变量用于对每一个实例都是唯一的数据,类变量用于类的所有实例共享的属性和方法:
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
a=MyClass()
b=MyClass()
print a.i is b.i
print a.i is MyClass.i
a.i=5
print a.i is b.i
print a.i is MyClass.i
重要的警告:默认值只计算一次。这使得默认值是可变的对象如列表、字典或大部分类的实例时会有所不同
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
def t(self,L=[]):
L.append('a')
return L
a=MyClass()
b=MyClass()
print a.t()
print b.t()
9.4 补充说明
通常,方法的第一个参数称为self。这仅仅是一个约定:名字self对 Python 而言绝对没有任何特殊含义。但是请注意:如果不遵循这个约定,对其他的 Python 程序员而言你的代码可读性就会变差,而且有些类 查看 器程序也可能是遵循此约定编写的。
问题:为啥p方法访问不到o,但如果在__init__函数里定义了o就可以访问呢
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
self.o=123
return 'hello world'
def t(self,L=[]):
L.append('a')
return L
def p(self):
print self.o
a=MyClass()
a.p()
9.8 异常也是类
class B:
pass
class C(B):
pass
class D(C):
pass
for c in [B, C, D]:
try:
raise c()
except D:
print "D"
except C:
print "C"
except B:
print "B"
9.9 迭代器
class Reverse:
"""Iterator for looping over a sequence backwards."""
def __init__(self, data):
self.data = data
self.len=len(data)
self.index=-1
def __iter__(self):
return self
def next(self):
if self.index == self.len-1:
self.index=-1
raise StopIteration
self.index = self.index + 1
return self.data[self.index]
r=Reverse('abc')
for x in r:
print x
print r.index
二、标准库概览(PT第十、十一章)
导入模块语句
模块即为一个py文件,模块名就是py文件名去掉.py,import后面接的就是模块名,不同的模块可以放在不同的包(就是文件夹啦,from后面接的那个就是包名)里,导入方法有两种,比如包名叫做package,模块名叫module,这个模块里有个方法叫做function(),有个类叫Class
方式1:
import package.module
#调用方法的方式为
package.module.function()
import package.module
#调用方法的方式为
package.module.Class()
方式2:
from package import module
#调用方法的方式为
module.function()
而且,import后面可以接模块内的方法名,from后面接模块名,比如:
from package.module import function
#可以直接调用
function()
from package.module import Class
#可以直接调用
Class()
然而并不存在import package.module.function的用法
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。