廖雪峰python学习笔记【11】面向对象编程

一、面向对象编程

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. 不要对实例属性和类属性使用相同的名字。

猜你喜欢

转载自blog.csdn.net/liufuchun111/article/details/80494639