1.python早期的版本和现有版本存在着一些区别,现有版本的一些属性在旧版本上可能不再适用,故而,为了能够保证兼容,需要做些处理,方法有两种:
1>.把赋值语句__metaclass__=type放在模块的最开始
2>.新定义类时继承于object或者其他新式类
2.python的魔法方法或者特殊方法指的是python类别中的一些具备特殊功能的方法,此类方法不需要通过用户显示调用,通常用于特定条件下自动触发实现,如构造函数__init__()或者析构函数__del__()等
3.在python类定义中如果存在构造函数的定义,则在定义相应类的对象时,就可同时执行构造函数,而不需要显示调用类中原有方法进行显式初始化,同样,与C++中一致,python构造函数也不能有返回值
4.python中不存在C++中一样的重载机制,当类中定义了多个同名不同参数个数的函数时,会自动选择最后一个函数作为函数原型,当输入不匹配时报错,这个与继承中选择遇到的第一个同名函数作为匹配函数是不同的。
5.之前介绍到如果某类继承自多个超类,同名函数访问时将按照顺序查找,而如果想避开此原则,直接调用特定版本的函数,则需要显式指定,如:
class SongBird(Bird):
def __init__(self):
Bird.__init__(self) #新版本中专门为这种情况设计了一个函数,super(SongBird, self).__init__(),相同的功能,不过只能用在新类中,所以需要设置__metaclass__
self.sound = 'Squawk!'
def sing(self)
print self.sound
super函数的智能不在于能替代直接采用超类调用未绑定方法,而在于不论有多少个超类,只需要这一个函数就可以完成全部的超类初始化(当然,需要保证各超类的初始化函数的参数均只有self一个,同事还要保证所有的超类均有super函数,即为新类),一般情况下,还是调用超类的未绑定构造方法更为合适,详情参见:http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035005.html
6.Python中为了应付类中存在多个变量而需要多个访问器方法的情况,新版本类中定义了一个property函数,函数包含了最多四个参数,按照次序依次是读写删档(文档),通过此方法定义的属性就可以像普通变量一样进行操作了,读,写等都非常便捷,详情参见:http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035600.html
7.Python的类定义中总共有三类方法,分别是对象方法(之前介绍过的需要添加self作为参数的方法),类方法(与对象方法类似,不过需要将self换成cls作为参数):此类方法可以访问类变量(相当于C++中的普通成员变量,而非静态成员变量),但是不能访问对象变量,即在对象方法中定义的变量;以及静态方法:此类方法不需要添加任何修饰参数,但是同时它也不能访问类中的任何变量,这个方法跟普通函数的区别在于其作用域仅限于类上(好处是不需要定义类的对象就可以通过类直接访问),详情参见:http://blog.chinaunix.net/uid-26602509-id-3087296.html和http://blog.csdn.net/baund/article/details/8714991
8.python可以实现对于列表、元组以及字符串的迭代(in),同样也可以在对象上定义迭代方法,可通过__iter__(self)方法实现:
>>> class Fibs:
... def __init__(self):
... self.a=0
... self.b=1
... def next(self): #实现了__iter__(self)方法的对象是可迭代的,而实现了next(self)方法的对象则是迭代器
... self.a,self.b=self.b,self.a+self.b
... return self.a #当使用in来实现迭代时,所返回的值,此例给出的迭代器是无限长度的,当需要做截断可调用raise StopIteration
... def __iter__(self):
... return self
...
>>> for f in fibs: #相当于每轮循环均调用next并将值返回给f,故而实际上第一个f值为1而非0
... if f>0:
... print f
... break
...
1
>>>
9.任何包含了yield语句的函数都可称之为一个生成器。而所谓的生成器实际上就是一个函数,不过此函数比较特殊,其特殊之处在于不是一次性执行完毕,而是每次执行一小段,当遭遇yield语句时则暂停并保存所有变量,同时生成器所返回的值是一个对象,此对象可以看成是包含当前函数所有参数值的一个迭代器,而如果要想访问yield返回的值,可以采用next函数,而下一次调用此函数时则在上次暂停处继续执行直到遭遇下一个yield点或者函数执行完毕,详情参见:http://blog.csdn.net/scelong/article/details/6969276
>>> def flatten(nested):
... for sublist in nested:
... for element in sublist:
... yield element
...
>>> nested=[[1,2],[3,4],[6]]
>>> ex=flatten(nested)
>>> ex.next()
1
>>> ex.next()
2
>>>