以Mark Lutz著的《Python学习手册》为教程,每天花1个小时左右时间学习,争取两周完成。 --- 写在前面的话
2013-7-25 15:30 学习笔记
1,把简单的非函数对象赋值给类属性,就会产生数据属性,由所有实例共享。但对实例的属性进行赋值运算只会在该实例内创建或修改变量名。例如:
class FirstClass:
data = 'mathboy'
def __init__(self, value):
self.data = value
def display(self):
print self.data, FirstClass.data
x = FirstClass('linlin')
y = FirstClass('mo')
x.display()
y.display()
FirstClass.data = 'mathboylinlin'
x.display()
y.display()
x.data = 'colin'
x.display()
y.display()
输出结果为:
linlin mathboy
mo mathboy
linlin mathboylinlin
mo mathboylinlin
colin mathboylinlin
mo mathboylinlin
2,类方法中的self参数,用于返回调用的主体,即实例对象。方法可以通过类方法或实例方法的形式调用。通过类方法调用时,需要明确传递一个实例给self参数。例如:
class FirstClass:
def display(self,value):
print value
x = FirstClass()
x.display('linlin')
FirstClass.display(x, 'mathboy')
输出结果为:
linlin
mathboy
3,要明确调用父类的方法时,则必须使用类调用的方法。例如(不一定只是构造方法,其它父类方法也可以):
class FirstClass:
def __init__(self, value):
print 'FirstClass: %s' %value
class SecondClass(FirstClass):
def __init__(self, value):
FirstClass.__init__(self, value)
print 'SecondClass: %s' %value
x = SecondClass('linlin')
输出结果为:
FirstClass: linlin
SecondClass: linlin
4,抽象类是这样来实现的:
class Super:
def method(self):
self.action()
class MyClass(Super):
def action(self):
print 'hello world'
x = MyClass()
x.method()
输出结果为:
hello world
5,__getitem__方法实现重载索引运算。例如:
class MyClass:
def __getitem__(self, index):
return index ** 2
X = MyClass()
for i in range(5):
print X[i],
输出结果为:
0 1 4 9 16
6,Python的所有迭代环境都会先尝试__iter__方法,再尝试__getitem__方法。__iter__应返回一个迭代器对象,如果已经提供,Python就会反复调用这个迭代器的next()方法,直到发生StopIteration异常。如果没有找到类的__iter__方法,则会改用__getitem__机制。例如:
class MyClass:
def __init__(self, start, stop):
self.value = start - 1
self.stop = stop
def __iter__(self):
return self
def next(self):
if self.value == self.stop:
raise StopIteration
self.value += 1
return self.value ** 2
for x in MyClass(1,2):
for y in MyClass(3,4):
print x,y
输出结果为:
1 9
1 16
4 9
4 16
7,__getattr__和__setattr__用来重载对属性的引用。例如:
class MyClass1:
def __getattr__(self, attrname):
if attrname == 'boy':
return 'linlin'
elif attrname == 'girl':
return 'mo'
else:
return ''
class MyClass2:
def __setattr__(self, attr, value):
if attr == 'boy':
self.__dict__[attr] = value + 'linlin'
elif attr == 'girl':
self.__dict__[attr] = value + 'love'
else:
self.__dict__[attr] = value
x = MyClass1()
print x.boy, x.girl
y = MyClass2()
y.boy = 'mathboy'
y.girl = 'mo'
print y.boy, y.girl
输出结果为:
linlin mo
mathboylinlin molove
8,__del__用于重载析构方法。__repr__和__str__用于重载在对类调用repr和str函数时重载返回的字符串。__call__用于重载实例调用。
9,实例和类对象就是Python中带有链接的字典。