一键生成表白网站,网站建设发展方向及前景展望,营销活动策划方案,做网站最好软件什么是Python的多态#xff1f;多态的好处就是#xff0c;当我们需要传入Dog、Cat、Tortoise……时#xff0c;我们只需要接收Animal类型就可以了#xff0c;因为Dog、Cat、Tortoise……都是Animal类型#xff0c;然后#xff0c;按照Animal类型进行操作即可。由于Animal…什么是Python的多态多态的好处就是当我们需要传入Dog、Cat、Tortoise……时我们只需要接收Animal类型就可以了因为Dog、Cat、Tortoise……都是Animal类型然后按照Animal类型进行操作即可。由于Animal类型有run()方法因此传入的任意类型只要是Animal类或者子类就会自动调用实际类型的run()方法这就是多态的意思对于一个变量我们只需要知道它是Animal类型无需确切地知道它的子类型就可以放心地调用run()方法而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上由运行时该对象的确切类型决定这就是多态真正的威力调用方只管调用不管细节而当我们新增一种Animal的子类时只要确保run()方法编写正确不用管原来的代码是如何调用的。这就是著名的“开闭”原则对扩展开放允许新增Animal子类对修改封闭不需要修改依赖Animal类型的run_twice()等函数。多态即多种形态在运行时确定其状态在编译阶段无法确定其类型这就是多态。Python中的多态和Java以及C中的多态有点不同Python中的变量是弱类型的在定义时不用指明其类型它会根据需要在运行时确定变量的类型(个人觉得这也是多态的一种体现)并且Python本身是一种解释性语言不进行预编译因此它就只在运行时确定其状态故也有人说Python是一种多态语言。在Python中很多地方都可以体现多态的特性比如内置函数len(object)len函数不仅可以计算字符串的长度还可以计算列表、元组等对象中的数据个数这里在运行时通过参数类型确定其具体的计算过程正是多态的一种体现。这有点类似于函数重载(一个编译单元中有多个同名函数但参数不同)相当于为每种类型都定义了一个len函数。这是典型的多态表现。有些朋友提出Python不支持多态我是完全不赞同的。 本质上多态意味着可以对不同的对象使用同样的操作但它们可能会以多种形态呈现出结果。len(object)函数就体现了这一点。在C、Java、C#这种编译型语言中由于有编译过程因此就鲜明地分成了运行时多态和编译时多态。运行时多态是指允许父类指针或名称来引用子类对象或对象方法而实际调用的方法为对象的类类型方法这就是所谓的动态绑定。编译时多态有模板或范型、方法重载(overload)、方法重写(override)等。而Python是动态语言动态地确定类型信息恰恰体现了多态的特征。在Python中任何不知道对象到底是什么类型但又需要对象做点什么的时候都会用到多态。有一种称为”鸭子类型(duck typing)“的东西讲的也是多态_metaclass_type # 确定使用新式类class Duck:def quack(self):print Quaaaaaack!def feathers(self):print The duck has white and gray feathers.class Person:def quack(self):print The person imitates a duck.def feathers(self):print The person takes a feather from the ground and shows it.def in_the_forest(duck):duck.quack()duck.feathers()def game():donald Duck()john Person()in_the_forest(donald)in_the_forest(john)game()就in_the_forest函数而言参数对象是一个鸭子类型它实现了方法多态。但是实际上我们知道从严格的抽象来讲Person类型和Duck完全风马牛不相及。运算符多态def add(x,y):return xyprint add(1,2) #输出3print add(hello,,world) #输出hello,worldprint add(1,abc) #抛出异常 TypeError: unsupported operand type(s) for : int and strPython的加法运算符是”多态“的理论上我们实现的add方法支持任意支持加法的对象但是我们不用关心两个参数x和y具体是什么类型。Python同样支持运算符重载class Vector:def __init__(self, a, b):self.a aself.b bdef __str__(self):return Vector (%d, %d) % (self.a, self.b)def __add__(self,other):return Vector(self.a other.a, self.b other.b)v1 Vector(2,10)v2 Vector(5,-2)print v1 v2在C, Java, C#中实现多态的方式通常有重写和重载两种从上面两段代码我们其实可以分析得出Python中实现多态也可以变相理解为重写和重载。在Python中很多内置函数和运算符都是多态的。[Reference]https://vancele.gitbooks.io/python/content/chapter7.html