以下为对廖雪峰Python的学习笔记
面向对象编程
- 在Python中,实例的变量名如果以__(两个下划线__)开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
- 需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量
- 判断对象类型,使用type()函数
- 判断class的类型,可以使用isinstance()函数
- 能用type()判断的基本类型也可以用isinstance()判断,以判断是否是list或者tuple
- dir():
获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法 - 对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。
- 对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了
- Python是动态语言,根据类创建的实例可以任意绑定属性。
10.类属性属于类所有,所有实例共享一个属性; 不要对实例属性和类属性使用相同的名字,否则将产生难以发现的错误。
面向对象高级编程
- __slots__变量:限制该class实例能添加的属性
- @property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。
- MixIn:在设计类的继承关系时,通常,主线都是单一继承下来的。但是,如果需要“混入”额外的功能,通过多重继承就可以实现,这种设计通常称之为MixIn。
- Python的class允许定义许多定制方法,非常方便地生成特定的类。详细见python官方文档
- 定制类__str__():返回用户看到的字符串
- 定制类__repr__():返回程序开发者看到的字符串,即__repr__()是为调试服务的。
- 定制类__iter__():如果一个类想被用于for … in循环,类似list或tuple那样,就必须实现一个__iter__()方法
- 定制类__getitem__():现得像list那样按照下标取出元素,需要实现__getitem__()方法
- 定制类__getattr__():调用属性不存在是,动态返回一个属性
- 定制类__call__():直接在实例本身上调用。另__call__()还可以定义参数。通过callable()函数,我们就可以判断一个对象是否是“可调用”对象。
- @unique装饰器可以检查Enum保证没有重复值。
- Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较。
- 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。
- metaclass,直译为元类,先定义metaclass,就可以创建类,最后创建实例。