python学习19类5之多态与鸭子模型

‘‘‘‘‘‘‘‘‘一、多态1.Python中多态是指一类事物有多种形态。‘‘‘

class Animal:    def run(self):        raise AttributeError(‘子类必须实现这个方法‘)  #抛出异常

class People(Animal):    def run(self):        print(‘人正在走‘)

class Pig(Animal):    def run(self):        print(‘pig is walking‘)

class Dog(Animal):    def run(self):        print(‘dog is running‘)

peo1=People()pig1=Pig()d1=Dog()

peo1.run()pig1.run()d1.run()‘‘‘多态,可以这样理解,不同的对象都可以响应同一个方法,但执行结果各不相同2.多态使用场景:(1)统一管理 (2)方法返回同一父类的不同子类对象 (3)方法参数接收同一父类的不同子类对象3.多态实现:(1)不同子类继承同一父类,重写要执行的方法,保证执行结果各不相同            (2)采用鸭子模型的思想,为任意一个类植入需要的方法也可以实现‘‘‘#下面这个例子更加能让我们了解多态的本质

class Triangle:    def __init__(self, width, height):        self.width = width        self.height = height

    def getArea(self):        area = self.width * self.height / 2        return area

class Square:    def __init__(self, size):        self.size = size

    def getArea(self):  # 同一个方法在不同的类中最终呈现出不同的效果,即为多态        area = self.size * self.size        return area

a = Triangle(5, 5)print(a.getArea())b = Square(5)print(b.getArea())

‘‘‘二、鸭子模型:只要一个东西看起来像鸭子,他就是鸭子1.在鸭子模型中,关注的不是对象的类型本身,而是它是如何使用的。

例如,在不使用鸭子模型的语言中,我们可以编写一个函数,它接受一个类型为"鸭子"的对象,并调用它的"走"和"叫"方法。在使用鸭子模型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的"走"和"叫"方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的"走"和"叫"方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名。‘‘‘class Duck():    def walk(self):        print(‘I walk like a duck‘)    def swim(self):        print(‘I swim like a duck‘)

class Person():    def walk(self):        print(‘this one walk like a duck‘)    def swim(self):        print(‘this man swim like a duck‘)#可以很明显的看出,Person类拥有跟Duck类一样的方法,这时我们可以写一个函数,这个函数接受任何这种类似的类(有相同的方法的类),并且可以调用他们相同的方法def fc(obj):  #object类是Python中所有类的父类    obj.walk()peo2=Person()fc(peo2) #这时调用这个函数,就可以调用传入类的方法‘‘‘

当有一个函数调用Duck类,并利用到了两个方法walk()和swim()。我们传入Person类也一样可以运行,函数并不会检查对象的类型是不是Duck,只要他拥有walk()和swim()方法,就可以正确的被调用。若传入的类没有要调用的方法,会报错,告诉你参数没有这个属性或方法‘‘‘‘‘‘2.使用场景:(1)统一管理(2)方法返回一个类似该类的对象(3)方法接收一个类似该类的对象‘‘‘

原文地址:https://www.cnblogs.com/wsxcode/p/12444934.html

时间: 2024-08-04 09:19:29

python学习19类5之多态与鸭子模型的相关文章

python学习笔记-类的descriptor

descriptor应用背景 所谓描述器,是实现了描述符协议,即get, set, 和 delete方法的对象. 简单说,描述符就是可以重复使用的属性. 比如以下代码: f = Foo() b = f.bar f.bar = c del f.bar 在解释器执行上述代码时,当发现你试图访问属性(b = f.bar).对属性赋值(f.bar = c)或者删除一个实例变量的属性(del f.bar)时,就会去调用自定义的方法. 为什么把对函数的调用伪装成对属性的访问?有什么好处? 从property

Python学习记录七---继承、多态和封装

1.创建类 创建文件 test7.py #! /usr/bin/env python class Person: def setName(self, name): self.name = name def getName(self): return self.name def greet(self): print "hello, world! I am %s."% self.name foo = Person() foo.setName('yilia') foo.getName() f

C++学习19 类的多继承

在前面的例子中,派生类都只有一个基类,称为单继承.除此之外,C++也支持多继承,即一个派生类可以有两个或多个基类. 多继承容易让代码逻辑复杂.思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java.C#.PHP 等干脆取消了多继承.想快速学习C++的读者可以不必细读. 多继承的语法也很简单,将多个基类用逗号隔开即可.例如已声明了类A.类B和类C,那么可以这样来声明派生类D: class D: public A, private B, protected C{ //类D新增加的成员 } D

python学习之 类class

定义 Python 的 Class 比较特别,和我们习惯的静态语言类型定义有很大区别. 1. 使用一个名为 __init__ 的方法来完成初始化.2. 使用一个名为 __del__ 的方法来完成类似析购操作.3. 所有的实例方法都拥有一个 self 参数来传递当前实例,类似于 this.4. 可以使用 __class__ 来访问类型成员 >>>>>> class MyClass: def __init__(self): print "initialize.&q

Python学习_11_类和实例

类和实例 类是对象创建实例的模板,而实例则是对象的实体.类使用class关键字定义: class MyClass:? ? pass python中创建实例直接使用工厂函数(类名加上一对括号),和其他的语言使用new关键字有所不同: my_obj = MyClass() 一般来说,类名以大写字母开头,而对象名则以小写字母或者下划线开头. 实例化对象时,会执行类定义中的__init__()方法,该方法执行时包含实例的各种初始化操作. 方法和函数的区别:方法由对象调用,在方法定义中,第一个参数必须是显

python学习——定制类

看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()函数. 除此之外,Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类. __str__ 我们先定义一个Student类,打印一个实例: >>> class Student(object): ... def __init__(self, name):

Python学习(类属性与实例属性)

编程语言都围绕着实例(对象),函数关系,及作用域展开(对象的生命周期) Python的import sys或者其它类似于c语言编译时的链接过程,不在同一个文件中的函数关系,我们怎样才能利用到它 Python的类跟c++的类基本是同一个东西,Python没有protected的权限,只有private和public,感觉友好很多 实例属性与c++的普通成员相同,类属性则类似于静态成员(static变量),初始化一次,通过类名访问和修改,所有的实例维护类的同一份的static成员变量 __init_

python学习13类2之封装

'''''''''面向对象三大特性:封装,继承,多态1.封装: 类中以_或者__的属性,都是私有属性,禁止外部调用.'''class Student(object): def __init__(self,name,age,sex): self.__name = name self.__age = age self.__sex = sex one = Student('wsx',18,'男') print(one._Student__name)print(one._Student__age)pri

Python学习-19.Python的Http模块

模拟 http 请求是比较常见的一种需求,在 Python 中,使用 http 模块操作. 1 import http.client 2 3 # 创建 Http 连接. 4 http = http.client.HTTPConnection('www.baidu.com') 5 # 设置请求,第一个参数为请求方法,第二个参数为请求的页面. 6 http.request('GET','/') 7 # 获取百度主页的内容,返回的是一个 bytes. 8 html = http.getresponse