一、面向对象编程
1. 面向对象首先考虑的不是程序的执行流程,而是类的设计。
2. 数据封装,继承和多态是面向对象的三大特点。
二、类和实例
1. 类中__init__方法中的第一个参数self,指向的是创建的实例本身。
2. 方法就是与实例绑定的函数。
3. python是动态语言,允许对实例变量绑定任何数据。也就是说创建实例后,仍然可以动态的为实例绑定变量(属性)。
三、访问限制
1. 通过在属性名称前加双下划线"__",可以将对应属性变成私有变量。只有内部可以访问,外部不能访问。
1.1 其实是python解释器给以双下划线开头的变量__AttrName起了一个新名字:__ClassName_AttrName
2. __AttrName__ : 以双下划线开头,双下划线结尾的变量是特殊变量,不是private变量。
3. _AttrName : 以单下划线开头的变量,不是private变量,但是最好不直接访问。
四、继承和多态
1. 继承的好处:子类获得父类的全部功能。
2. 动态语言vs静态语言
2.1 Java是静态语言。定义函数时,如果参数是Animal类型,则调用函数时 传入的对象必须时Animal类型或者Animal的子类型。
2.2 Python是动态语言。没有上述限制。“鸭子类型”特点决定了继承不想静态语言那样是必须的。
五、获取对象信息
1. type()函数;
1.1 基本类型都可以type()判断。
1.1.1 type(123): <class 'int'>
1.1.2 type(123) == int
1.1.3 type('abc') == str
1.1.4 type(b'123') == bytes
1.2 指向函数或类的变量,可以用type()判断变量的类型
1.2.1 type(abs): <class 'builtin_function_or_method'>
1.3 types模块中定义了如下常量;
1.3.1 type(func) == types.FunctionType # func为自定义函数。
1.3.2 type(abs) == types.BduildinFunctionType
1.3.3 type(lambda x : x) == types.LambdaType
1.3.4 type( (x for x in range(10)) ) == types.GeneratorType
2. isinstance()函数
2.1 对于具有继承关系的类实例来说,使用isinstance()函数判断实例的类型。
2.2 优先使用isinstance()判断,可以将指定类型及其子类型一网打尽。
3. dir()函数
3.1 获取对象所有的属相和方法。
3.2 getattr(obj, 'attr') # 获取对象obj的attr属性。
3.3 getattr(obj, 'method') # 获取对象obj的method方法。
3.4 setattr(obj, 'attr', value) # 设置对象obj的attr属性的值为value。
3.5 hasattr(obj, 'attr') # 判断对象obj是否有attr属性。
3.6 hasattr(obj, 'method') # 判断对象obj是否有method方法。
六、实例属性和类属性
1. 可以通过实例变量或self变量给实例绑定属性。
2. 实例属性属于各个实例所有,互不干扰。
3. 类属性属于类所有,所有实例共享。
4. 不要对实例属性和类属性使用相同的名字。