类数据属性和实例数据属性
特殊的类属性
属性隐藏
实例方法
类方法
静态方法
单下划线”_”
双下划线”__”
本文介绍了Python中class的一些基本点:
实例数据属性和类数据属性的区别,以及属性隐藏
实例方法,类方法和静态方法直接的区别
Python中通过”_”和”__”实现的访问控制
Refer:http://python.jobbole.com/82297/
继承中的__init__
super
MRO
__slots__
子类没有__slots__属性
子类拥有__slots__属性
本文介绍了Python中的继承,当使用多继承的时候,可以使用super关键字去访问父类中被子类覆盖的方法;对于方法的调用,需要参照MRO。
另外介绍了Python类的__slots__属性,通过这个属性可以限制类实例的可用属性。
Refer:http://python.jobbole.com/82308/
__new__特性
重写__new__
__init__的调用
派生不可变类型
调用魔术方法
文中介绍了类的构造和初始化方法:”__new__”和”__init__”。
“__new__”方法是新式类特有的方法,通常情况下,__new__方法会创建返回cls(cls指代当前类)的实例,然后调用该类的”__init__”方法作为初始化方法,该方法接收这个实例(即self)作为自己的第一个参数,然后依次传入”__new__”方法中接收的位置参数和命名参数;但是,如果”__new__”没有返回cls(即当前类)的实例,那么当前类的”__init__”方法是不会被调用的。
通过”魔术方法”,可以对自定义类进行定制、扩展,使得自定义类变得强大、易用。
Refer:http://python.jobbole.com/82312/
self代表类的实例,而非类
self不必非写成self
self可以不写吗
在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例
在描述符类中,self指的是描述符类的实例
总结:
self在定义时需要定义,但是在调用时会自动传入。
self的名字并不是规定死的,但是最好还是按照约定是用self
self总是指调用时的类的实例。
Refer:http://python.jobbole.com/81921/
描述符协议中定义了“__get__”、“__set__”、”__delete__” 这些特殊方法
Refer:http://python.jobbole.com/81211/
类也是对象
动态地创建类
到底什么是元类
__metaclass__属性
自定义元类
为什么要用metaclass类而不是函数?
究竟为什么要使用元类?
结语:
首先,你知道了类其实是能够创建出类实例的对象。好吧,事实上,类本身也是实例,当然,它们是元类的实例。
>>>class Foo(object): pass >>> id(Foo) 142630324
Python中的一切都是对象,它们要么是类的实例,要么是元类的实例,除了type。type实际上是它自己的元类,在纯Python环境中这可不是你能够做到的,这是通过在实现层面耍一些小手段做到的。其次,元类是很复杂的。对于非常简单的类,你可能不希望通过使用元类来对类做修改。你可以通过其他两种技术来修改类:
1) Monkey patching
2) class decorators
当你需要动态修改类时,99%的时间里你最好使用上面这两种技术。当然了,其实在99%的时间里你根本就不需要动态修改类 :D
Refer:http://python.jobbole.com/21351/
可变长度参数(*args 和 **kwargs)
非关键字变长参数(元组)
关键字变长参数(字典)
匿名函数(lambda)
几个内建函数:filter(),map(),reduce()
Refer:http://python.jobbole.com/82300/
__iter__()和next()方法
自定义迭代器
迭代器和可迭代对象
生成器执行流程
生成器表达式
递归生成器
生成器的send()和close()方法
本文介绍了Python迭代器和生成器的相关内容。
通过实现迭代器协议对应的__iter__()和next()方法,可以自定义迭代器类型。对于可迭代对象,for语句可以通过iter()方法获取迭代器,并且通过next()方法获得容器的下一个元素。
像列表这种序列类型的对象,可迭代对象和迭代器对象是相互独立存在的,在迭代的过程中各个迭代器相互独立;但是,有的可迭代对象本身又是迭代器对象,那么迭代器就没法独立使用。
itertools模块提供了一系列迭代器,能够帮助用户轻松地使用排列、组合、笛卡尔积或其他组合结构。
生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__()和next()方法。
生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果。
Refer:http://python.jobbole.com/82320/
原文:http://my.oschina.net/leejun2005/blog/515659