如何免费建立一个自己的网站,毕设DW做网站的过程,南乐网站建设价格,网页设计素材书一. 鸭子类型和多态 1.什么是鸭子类型#xff1a; 在程序设计中#xff0c;鸭子类型#xff08;英语#xff1a;Duck typing#xff09;是动态类型和某些静态语言的一种对象推断风格。鸭子类型像多态一样工作#xff0c;但是没有继承。“鸭子类型”的语言是这…一. 鸭子类型和多态 1.什么是鸭子类型 在程序设计中鸭子类型英语Duck typing是动态类型和某些静态语言的一种对象推断风格。鸭子类型像多态一样工作但是没有继承。“鸭子类型”的语言是这么推断的一只鸟走起来像鸭子、游起泳来像鸭子、叫起来也像鸭子那它就可以被当做鸭子。也就是说它不关注对象的类型而是关注对象具有的行为(方法)。 可以看出CatDogDuck中有相同的方法say()当有一个函数调用Duck类时并调用say()方法我们传入Cat类和Dog类也行函数并不会检查对象是不是Duck而是只要你有这样的方法就能运行。 如列表的extend()方法只要参数是一个可迭代的对象就可以list,set,tuple 还有前面的例子只要实现了类中的__getitem__()魔法函数就可以把类当作一个collection实现啊__iter__和__next__就可以当作一个iterator。python中的鸭子类型允许我们使用任何提供所需方法的对象而不需要迫使它成为一个子类。 2.多态 由于python属于动态语言当你定义了一个基类和基类中的方法并编写几个继承该基类的子类时由于python在定义变量时不指定变量的类型而是由解释器根据变量内容推断变量类型的也就是说变量的类型取决于所关联的对象这就使得python的多态不像是c或java中那样定义一个基类类型变量而隐藏了具体子类的细节。 二. 抽象基类(abc模块) 1.在某些情况下判断某个对象的类型 2.强制某个子类必须实现某些方法 3.模拟抽象基类 3.1利用内置抛错模拟(但只有调用某些方法时才会抛异常) 1 class CacheBase():2 def get(self,key):3 #默认抛出异常Python内置错误4 raise NotImplementedError5 def set(self,key,value):6 raise NotImplementedError7 #继承重写就不会抛异常8 class Rediscatche(CacheBase):9 def get(self,key):
10 pass
11 def set(self,key,value):
12 pass
13 cachebaseRediscatche()
14 cachebase.set(key,value) 3.2利用内置的abc模块 3.3通用的抽象基类collections.abc模块,推荐使用多继承mixin以防抽象基类设计过度 有可遍历可哈希的等等抽象基类 这些抽象基类都有一个魔法函数__subclasshook__ 作用Comp()没有继承Sized但是却能判断出是Sized类型。 __subclasshook__会判断传入的C是否有“__len__”这个方法有就返回为True 三. 使用isintance而不是type isinstance内部会去检查它的继承链就可以判断它是A的类型而type是指向B那个对象判断是否和B是同一个对象。尽量应使用isinstance而不是type以免误判。 is和 is是判断两者是不是一个对象即id是否相同而是判断值是否相同。如type(b)指向的是B这个对象虽然B继承于A但是A和B是两个不同的对象。 四. 类变量和对象变量 注1.魔法函数__init__中self是实例化对象中的参数是对象变量在实例化后调用变量是向上查找即先查找对象变量后查找类变量类变量可以直接通过类访问 2.类变量是所有实例共享的 通过类修改类变量 通过实例对象修改变量 五. 类属性和实例属性以及查找顺序 1.向上查找即先查找对象变量实例属性后查找类属性 2.多继承采用MRO【Method Resolution Order】方法解析顺序算法 Python语言包含了很多优秀的特性其中多重继承就是其中之一但是多重继承会引发很多问题比如二义性Python中一切皆引用这使得他不会像C一样使用虚基类处理基类对象重复的问题但是如果父类存在同名函数的时候还是会产生二义性Python中处理这种问题的方法就是MRO。 DFS深度优先算法这样查询顺序为A-B-D-C-E 这样就会出现问题菱形继承如果C继承D覆盖D中的某方法在调用时是先查询D然后查询C则查询的方法是D中的而不是C中重写的因此在Python2 后改成了广度优先的算法。 广度优先算法这就解决了菱形继承但是在第一种又出现了问题 如D和C中如果有个同名的方法则会调用C中的方法而不是D中的而B是继承D的因此从Python2.3后都统一为C3算法 3.C3算法参考https://www.cnblogs.com/LLBFWH/p/10009064.html 求某一类在多继承中的继承顺序: 类的mro [类] [父类的继承顺序] [父类2的继承顺序] 如果从左到右的第一个类在后面的顺序中出现,那么就提取出来到mro顺序中 [ABCD] [EO] -- A [BCD] [EO] 如果从左到右的第一个类在后面的顺序中出现,且在后面的顺序中也是第一位,那么就提出来到mro顺序中 [ABCD] [AEO] -- A [BCD] [EO] 如果从左到右的第一个类在后面的顺序中出现,但不是在第一位,那么应该继续往后找,找到符合规则的项目 [ABCD] [EAO] -- E [ABCD] [AO] [ABCD] [EAO] [GEO] -- G [ABCD] [EAO] [EO] [ABCD] [EAO] [EO] -- GE [ABCD] [AO] [O] 关键结论: 这个类没有发生继承,他的顺序永远是[类o] 只要是单继承,不是多继承,那么mro顺序就是从子类到父类的顺序 4.查找顺序 4.1菱形继承Python2.3以前为经典类默认不继承objectD而2.3以后为新式类默认继承object即最后查找object类 4.2分别继承 六. 静态方法、类方法以及对象方法 1.实例方法self为实例对象 2.静态方法相当于普通的函数 注采用硬编码如果类名改变相应的静态方法中也要改变如下面的Date改变则parse_from_string中Date也相应改变 利用外部对参数处理传入每次都需要处理麻烦 利用静态方法 静态方法用处如在判断传入的参数是否为合法字符串这是不用返回类对象因此不用传入类类方法 3.类方法传递的是类cls 注相比静态方法不是采用硬编码无论类名称是什么都不用修改类方法且传递的是类cls,只是名称可以修改 七. 数据封装和私有属性 1.私有属性 无法实例或类直接访问私有属性只有通过类中的公共方法get_age间接访问 2.私有属性原理 把具有双下划线的属性如__birthday变为[_classname__attr]即_User__birthday,因此不是从语言层面解决了绝对私有性只是加了一些小技巧。主要只是让我们书写更加规范没有绝对的安全也可以解决同样的变量名冲突的问题。如另一个类继承User且也有__birthday则根据规则是不一样的 仍然能访问 八. python对象的自省机制 1.概念 自省是通过一定的机制查询到对象的内部结构 2.__dict__,dir的使用 2.1通过dict查找属性 实例的属性但是通过name属性却能查找到向上查找name属性User类这个对象 类属性含有模板文档属性弱引用等 2.2通过__dict__添加修改属性 2.3通过dir查找属性会列出所有属性比__dict__更加详细 只有属性名称没有属性值还可以对list等使用 九. super函数 1.如果想调用A中的构造函数 Python2super(B,self).__init__() Python3中:super().__init__() 2.既然重写A的构造函数为什么还要调用super 很好的重用代码如某个参数需要父类的构造函数处理就可以调用super函数把参数交给父类的构造函数处理 将name交给Thread的构造函数处理 3.super执行顺序 super并不是直接调用父类而是根据MRO算法的调用顺序(因此先是C然后是A) 十. django rest framework中对多继承使用的经验 1.建议 尽量不要使用多继承以免造成混乱 2.mixin多继承案例如django restframework中的mixins 1.mixin类功能单一 2.不和基类关联可以和任意基类组合基类可以不和mixin关联就能初始化成功 3.在mixin中不要使用super函数 4.尽量以Mixin结尾 十一.python中的with语句 1.try...except语句 except语句中将2压入堆栈中finally又将4压入堆栈中所以在取数据时直接从栈顶取数据因此是4如果没有finally则是前面的(如果要操作数据库文件等就需要在try中exceptfinally中书写关闭连接文件的逻辑)。 2.上下文管理器 上下文管理器协议需要实现两个魔法函数__enter__和__exit__ 需要在__enter__中获取资源在__exit__释放资源只要满足这个协议就可以用with语句使用 十二. contextlib实现上下文管理器 相当于简化__enter__和__exit__contextlib.contextmanager装饰器将__enter__和__exit__合起来并进行了一系列操作 十三.参考文献 MRO算法介绍转载于:https://www.cnblogs.com/lyq-biu/p/10310174.html