一、Python-面向对象(极速回顾)


返回

1、封装、继承、多态

  1. 封装
    • __属性名 == _类名__属性名

      封装数据:内部直接访问、外部通过接口访问
      封装方法:隔离复杂度,提高可扩展性

  2. 继承
    • 继承关系:

      动物

    • 派生

      python2:super(子类,self).父类方法()
      python3:super().父类方法()
      对于super(B,self).方法f(),先看self是谁的实例,假如是A类,则列出A类的mro列表,再找到mro列表中B类的位置,然后从B类的下一个类开始查找方法f

    • 组合关系

      学生 课程

    • 抽象类

      abc模块
      只能被继承,不能被实例化
      子类必须继承抽象类的方法

  3. 多态性
    • python提倡鸭子类型

      即属性看起来像就行,不需要继承抽象类来约束属性

2、绑定方法、非绑定方法

  1. 绑定到对象
    • 无装饰器

      调用者:对象(自动传参self对象)、类(手动传参self对象)

  2. 绑定到类
    • @classmethod

      调用者:类、对象(自动传参cls类)

  3. 非绑定方法
    • @staticmethod

      调用者:类、对象(手动传参)

3、反射

  1. 通过字符串访问属性
    • hasattr(类/对象,'属性名'))
    • getattr(类/对象,'属性名',None))
    • setattr(类/对象,'属性名',值)
    • delattr(类/对象,'属性名')

4、元类

  1. 定义类的两种方法

    • class 类名(基类元组):
    class A(object, metaclass=type):
        def __init__(self, name):
            self.name = name
    
    • 类名 = type(类名,基类元组,名称空间字典)
    class_name = 'A'
    class_bases = (object,)
    class_dict = {}
    class_body = """
    def __init__(self, name):
        self.name = name
    """
    exec(class_body, globals(), class_dict)
    A = type(class_name, class_bases, class_dict)
    
  2. 实例化

    # 自定义元类
    class MyMeta(type):
        def __init__(cls, class_name, class_bases, class_dict):
            super(MyMeta, cls).__init__(class_name, class_bases, class_dict)
            cls.__instance = None  # 单例
    
        def __call__(cls, *args, **kwargs):
            if not cls.__instance:
                # 1、创建obj
                obj = object.__new__(cls)
                # 2、初始化obj
                cls.__init__(obj, *args, **kwargs)
                # 单例
                cls.__instance = obj
            # 3、返回obj
            return cls.__instance
    
    
    # A = MyMeta(class_name, class_bases, class_dict)
    class A(object, metaclass=MyMeta):
        # 2、初始化obj
        def __init__(self, name):
            self.name = name
    
    
    a = A('小明')  # a = A.__call__('小明')
    

5、内置方法

  1. __dict__

    对象调用:对象内的所有数据属性
    类调用:类内的所有数据属性和函数属性

  2. __bases__

    类调用:查看类的直系父类

  3. 类名.mro()

    列出所有父类继承属性查询顺序

  4. def __getitem__(self, item):

    调用方式:对象['属性']

  5. def __setitem__(self, key, value):

    调用方式:对象['属性'] = 值

  6. def __delitem__(self, key):

    调用方式:del 对象['属性']

  7. def __getattr__(self, item):

    调用方式:对象.属性

  8. def __setattr__(self, key, value):

    调用方式:对象.属性 = 值

  9. def __delattr__(self, key):

    调用方式:del 对象.属性

  10. def __str__(self):
    return 'str'

    调用方式:str(对象)

  11. def __del__(self):

    调用方式:对象回收时

  12. def __call__(self, *args, **kwargs):

    调用方式:类()/对象()

6、描述符

  1. @property

    调用方式:对象.方法名

  2. @方法名.setter

    调用方式:对象.方法名 = 值

  3. @方法名.deleter

    调用方式:del 对象.方法名

  4. __get__
  5. __set__
  6. __delete__
返回