Python Tutorial笔记--9.类

看Tutorial的一些问题与解决

九.类

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 程序员而言你的代码可读性就会变差,而且有些类 查看 器程序也可能是遵循此约定编写的。

问题:

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()

为啥p方法访问不到o,但如果在__init__函数里定义了o就可以访问呢

 

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

9.11 生成器表达式

这是个啥

posted @ 2017-07-22 11:40  z_dominic  阅读(154)  评论(0编辑  收藏  举报