# 中医class Father: def cure(self): print("使用中医方法进行治疗")# 西医class Son(Father): def cure(self): print("使用西医方法进行治疗")# 患者class Patient: def needDoctor(self, doctor): doctor.cure()if __name__ == '__main__': oldDoctor = Father() littleDoctor = Son() patient = Patient() patient.needDoctor(oldDoctor) patient.needDoctor(littleDoctor)
鸭子类型鸭子类型(Duck Typing)是一种动态类型的概念,它源自于“走起来像鸭子、叫声像鸭子、看起来像鸭子,那么它就是鸭子”的观念在鸭子类型中,一个对象的适用性不是由它的类或接口决定,而是由它的方法和属性是否与所需的方法和属性匹配来决定换句话说,只要一个对象具有特定方法和属性,我们就可以将其视为具有相同类型举个例子,如果我们需要一个能“叫”的对象,并且某个对象有一个名为quack()的方法,那么我们可以将该对象视为一个“鸭子”,不管它实际上是什么类的对象换句话说,我们关注的是对象的行为而不是其类型鸭子类型在动态语言中特别常见,比如 Python在 Python 中,不需要显式地继承或实现接口,只要一个对象具有必需的方法和属性,它就可以被认为是某种类型这使得 Python 具有灵活性和简洁性,可以更自由地处理不同类型的对象# 中医class Father: def cure(self): print("使用中医方法进行治疗")# 西医class Son(Father): def cure(self): print("使用西医方法进行治疗")# 兽医class AnimalDoctor: def cure(self): print("使用兽医方法进行治疗")# 患者class Patient: def needDoctor(self, doctor): doctor.cure()if __name__ == '__main__': oldDoctor = Father() littleDoctor = Son() animalDoctor = AnimalDoctor() patient = Patient() patient.needDoctor(oldDoctor) patient.needDoctor(littleDoctor) patient.needDoctor(animalDoctor)
鸭子类型通常是动态语言的特性,相比于静态类型语言,它在编译时没有类型检查这意味着无法在编译阶段对类型不匹配或缺失方法和属性进行检测,可能会导致运行时错误类型检查Python 中提供了 isinstance() 和 issubclass() 两个函数,用来对数据进行检查判断isinstance()Python 中使用 isinstance() 来检查一个实例的类型格式:isinstance(obj, type)
判断 obj 对象是否是 Type 指定类型或其父类类型的实例 print(isinstance(littleDoctor, Father)) print(isinstance(littleDoctor, Son)) print(isinstance(littleDoctor, AnimalDoctor))
前面示例的代码可以进行优化:# 患者class Patient: def needDoctor(self, doctor): if isinstance(doctor, Father): doctor.cure() else: print("此大夫医疗方法不适用病人")
issubclass()Python 中还可以使用 issubclass() 来检查类的继承关系格式:issubclass(Type1, Type2)
判断 Type1 是否是 Type2 的子类 print(issubclass(Father, Father)) print(issubclass(Son, Father)) print(issubclass(AnimalDoctor, Father))
前面的示例也可优化为:class Patient: def needDoctor(self, doctor): if issubclass(doctor.__class__, Father): doctor.cure() else: print("此大夫医疗方法不适用病人")
__class__ 是一个魔法属性,用来获取当前实例对象的类霍格沃兹的测试管理班是专门面向测试与质量管理人员的一门课程,通过提升从业人员的团队管理、项目管理、绩效管理、沟通管理等方面的能力,使测试管理人员可以更好的带领团队、项目以及公司获得更快的成长提供 1v1 私教指导,BAT 级别的测试管理大咖量身打造职业规划作者:测试人链接:https://juejin.cn/post/7329573699756933129来源:稀土掘金著作权归作者所有商业转载请联系作者获得授权,非商业转载请注明出处(图片来源网络,侵删)
0 评论