面向对象补充

面向对象三大特性

  1. 继承
  • super作用:执行mro的下一个类中的相关方法
class Base:
    def func(self):
        print('base.func')
        super().func()  # 执行mro的下一个类中的func


class Foo:
    def func(self):
        print('foo.func')


class Bar(Base, Foo):
    pass


o = Bar()

o.func()

运行结果

base.func
foo.func

图示
面向对象补充_第1张图片

  • self到底是谁
    如果一个类a,继承了另外一个类b,这个类还继承了一个类c,如果a中有个self.方法d,有些在a中找,如果a没有就去b找,b没有去c找,再c中找到此方法d后,该方法中有self.方法f,又要回到最初的a中找。
  1. 封装
  • 将一些函数封装到一个类中,就是面向对象的思想。
    如一个py文件中有50个函数,由于很乱,所以分门别类整理好,找的时候比较方便。
    class DB():与DB相关的方法,class Cache:与缓存相关的方法
  • 将一些数据封装到一个对象中
    有些接口返回给用户json数据,一个字典,再接口中创建一个字典,再返回给用户数据获取与否的状态等。但如果要写20个接口,对应20个函数,意味着再每个函数中都定义这个字典,在重复过程中容易出错,所以把这个字典封装到一个对象中。实例化这个类,引用这个对象的数据,相对于前者比较简介且标准化
    两者方法对比:
    面向对象补充_第2张图片
    应用场景:
    DRF:requset即封装了Django的request又进一步封装了DRF的相关内容。
  1. 多态
    python本身就是多态(鸭子模型),
    如图:arg既可以传o,可以传b,只要能send
    面向对象补充_第3张图片
    对比java的多态:
def func(string: arg):  # arg指定了只能传string
    arg.send()
    # java的多态局限性:arg可以是string对象也可以是string的派生类的对象。
    # 而python中可以是任意对象
  • 面向对象的应用场景

    • drf的视图,写接口时继承的视图类:apiview,modelviewside等等
    • drf中request的封装
  • 面向对象中classmethod和staticmethod区别
    @classmethod
    @staticmethod
    共同点:都通过类调用,不用通过对象就可调用,staticmethod可以没有参数,classmethod至少有个个参数:类。

  • 面向对象的成员修饰符

    • 公有
    • 私有:双下滑线表示私有,只能自己类来调用,别的类调用不了。包括派生类(继承的类)
  • 面向对象的成员

class Foo:
    a = 123  # 类变量/静态字段、静态数据

    def __init__(self):
        self.name = 'Lau'  # 实例变量/字段/属性


    def func(self):  # 方法/绑定方法:绑定到类中的方法
        pass


    @classmethod
    def func(cls):   # 类方法
        pass


    @staticmethod
    def func():     # 静态方法
        pass


    @property
    def json(self):  # 属性
        return ...
  • 对象和对象之间能否相加

一般不能相加,如:

class F:
    pass


class B:
    pass


o1 = F()
o2 = B()

r = o1 + o2

运行结果

    r = o1 + o2
TypeError: unsupported operand type(s) for +: 'F' and 'B'

增加__add__方法

class F:
    def __init__(self, num):
        self.num = num
    def __add__(self, other):
        return self.num + other.num
    

class B:
    def __init__(self, num):
        self.num = num

o1 = F(2)
o2 = B(4)

r = o1 + o2  # 执行o1中的__add__方法,把后面对象当做参数传进去,
print(r)   # >>>6
  • 面向对象特殊方法
    • 双下滑线
    • _dict_
    • _call_:对象加括号执行其__call__方法,flask,django请求进来的入口都是在__call__这个方法中,一个web框架首先要做两步:准备工作:运行socket到recv等待请求到来,到来时立即执行操作,这步都是从__call__方法开始的
      图示
      flask:

面向对象补充_第4张图片
一旦请求进来,run_simple中的第三个参数self就会加括号,也就是对象加括号执行这个对象的__call__方法
面向对象补充_第5张图片
django:
面向对象补充_第6张图片
有些框架如果依赖wsgi,请求入口都比较相似。

  • _new_
    在__init__初始化之前,__new__返回什么,这个对象就是什么,构造方法
  • <

你可能感兴趣的:(python)