走入计算机的第三十一天(多态和绑定方法)

一 多态和多态性

1 什么是多态:多态就是一种失误的多种形态。(例如:水有冰的形态,还有水蒸气的形态等等)一个抽象类有多个子类,因而多态的概念依赖于继承。

序列类型有多种形态:字符串,列表,元组。

动物有多种形态:人,狗,猪

 1 import abc
 2 class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
 3     @abc.abstractmethod
 4     def talk(self):
 5         pass
 6
 7 class People(Animal): #动物的形态之一:人
 8     def talk(self):
 9         print(‘say hello‘)
10
11 class Dog(Animal): #动物的形态之二:狗
12     def talk(self):
13         print(‘say wangwang‘)
14
15 class Pig(Animal): #动物的形态之三:猪
16     def talk(self):
17         print(‘say aoao‘)

文件有多种形态:文本文件,可执行文件

 1 import abc
 2 class File(metaclass=abc.ABCMeta): #同一类事物:文件
 3     @abc.abstractmethod
 4     def click(self):
 5         pass
 6
 7 class Text(File): #文件的形态之一:文本文件
 8     def click(self):
 9         print(‘open file‘)
10
11 class ExeFile(File): #文件的形态之二:可执行文件
12     def click(self):
13         print(‘execute file‘)

2 什么是多态性

多态性是指具有不同函数的功能可以使用同一个函数名,也就是同一个函数名可以调用不同功能的函数。面向对象中是怎么表示多态性的:给不同的对象发送同一条信息,而不同对象在接收到信息后不同的行为或方法。也就是说每一个对象用自己的方式去响应共同的调用函数。不同的行为是指不同的实现,即不同的函数。

比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生执行的是放学操作,虽然二者消息一样,但是执行的效果不同

多态性分为静态多态性和动态多态性

静态多态性:如任何类型都可以用运算符+进行运算

动态多态性:如下1

2

 1 >>> def func(animal): #参数animal就是对态性的体现
 2 ...     animal.talk()
 3 ...
 4 >>> people1=People() #产生一个人的对象
 5 >>> pig1=Pig() #产生一个猪的对象
 6 >>> dog1=Dog() #产生一个狗的对象
 7 >>> func(people1)
 8 say hello
 9 >>> func(pig1)
10 say aoao
11 >>> func(dog1)
12 say wangwang

3

1 >>> def func(f):
2 ...     f.click()
3 ...
4 >>> t1=Text()
5 >>> e1=ExeFile()
6 >>> func(t1)
7 open file
8 >>> func(e1)
9 execute file

综上我们也可以说,多态性是‘一个接口(函数func),多种实现(如f.click())’

3为什么要用多态性(多态性的好处)

python本身就是支持多态性的

多态性的好处:1.增加了程序的灵活性:不管对象怎么变化,使用者都可以用同一种形式去调用它

2增加了程序额可扩展性:通过继承类创建了一个新的类,使用者无需更改自己的代码,还是用函数名(类名)去调用

 1 >>> class Cat(Animal): #属于动物的另外一种形态:猫
 2 ...     def talk(self):
 3 ...         print(‘say miao‘)
 4 ...
 5 >>> def func(animal): #对于使用者来说,自己的代码根本无需改动
 6 ...     animal.talk()
 7 ...
 8 >>> cat1=Cat() #实例出一只猫
 9 >>> func(cat1) #甚至连调用方式也无需改变,就能调用猫的talk功能
10 say miao
11
12 ‘‘‘
13 这样我们新增了一个形态Cat,由Cat类产生的实例cat1,使用者可以在完全不需要修改自己代码的情况下。使用和人、狗、猪一样的方式调用cat1的talk方法,即func(cat1)
14 ‘‘‘

二 绑定方法和非绑定方法

类中定义的函数分为了两大类:

1 绑定方法:绑定给谁,谁来调用就会自动的将它本身当作第一个参数被传入。

绑定到类的方法:classmethod装饰器是专门给类定制的

    类.函数名():类名会被自动当作第一个参数被传入。而对象调用时,也是将类名当作第一个参数被传入。

属于类的函数,类可以调用,但是没有自动传值。

classmehtod

 1 # class People:
 2 #     def __init__(self,name):
 3 #         self.nam=name
 4 #     def bar(self):
 5 #         print(self.name)
 6 #     @classmethod
 7 #     def func(cls):
 8 #         print(cls)
 9 # t=print(‘egon‘)
10 # print(t.bar)
11 # People.func()
12 #

绑定给对象的方法:没有被任何装饰器给装饰,为对象专门定制的。

对象名.函数名(),而对象会被自动当中第一个参数给传入。

2 非绑定方法:用staticmethod装饰器来装饰的。

不与类或对象绑定,但是他们都可以调用。但是没有传值,只是一个普通的工具。

注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说

   

statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果,python为我们内置了函数staticmethod来把类中的函数定义成静态方法

 1 import hashlib
 2 import time
 3 class MySQL:
 4     def __init__(self,host,port):
 5         self.id=self.create_id()
 6         self.host=host
 7         self.port=port
 8     @staticmethod
 9     def create_id(): #就是一个普通工具
10         m=hashlib.md5(str(time.clock()).encode(‘utf-8‘))
11         return m.hexdigest()
12
13
14 print(MySQL.create_id) #<function MySQL.create_id at 0x0000000001E6B9D8> #查看结果为普通函数
15 conn=MySQL(‘127.0.0.1‘,3306)
16 print(conn.create_id) #<function MySQL.create_id at 0x00000000026FB9D8> #查看结果为普通函数

时间: 2024-11-05 15:50:54

走入计算机的第三十一天(多态和绑定方法)的相关文章

走入计算机的第三十天(继承实现原理和封装)

一 继承的实现原理 1 继承的实现顺序 从左到有依次查找,     每一个分支查找完了才进行下一个分支的查找 在新式类中每个分支属于同一个父类的时候查找的顺序是如下 这种属于广度优先,就是在新式类中,查找从左到右每个分支依次查找完毕过后,最后在查找他们共同的父类. 在经典类中每个分支属于同一个父类的时候查找的顺序是如下 这种属于深度查找,就是在经典类中,从左到右,每个分支查找到底,在进行下一个分支的查找,但是在他们共同父类第一次查找过后,就不会在查找他们共同的父类了. 1 class A(obj

Python基础(17)_面向对象程序设计(抽象类、继承原理、封装、多态,绑定方法)

一.抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化 1.在python中实现抽象类 import abc #利用abc模块实现抽象类 class All_file(metaclass=abc.ABCMeta): all_type='file' @abc.abstractmethod #定义抽象方法,无需实现功能 def read(self): '子类必须定义读功能' pass @abc.abstractmethod #定义抽象方法,无需实现功能 def write(sel

python基础18 ---多态与绑定方法

一.抽象类 1.抽象类的定义:从一堆类中抽象出相同的内容,重新组成一个新的类,这样的类属于抽象类. 2.香蕉类是一类水果,苹果类是一类水果,葡萄类是一类水果,但是他们都属于水果,从他们这些类中可以抽象出相同的部分都是属于水果类,这个水果类就属于抽象类.但是你永远无法吃到一个叫水果的对象,所以抽象类是不能被实例化的,他只能被别的类所继承,并且子类必须实现抽象方法. 3.该抽象类主要和abc模块结合使用.(之前将的读和写) 4.抽象类的本质还是类,指的是一组类的相似处,包括数据属性和函数属性,而接口

property,多态,绑定方法与非绑定方法

1.property property本质就是一个python为你准备好了的--装饰器,那既然他是装饰器,也就意味着他的用法就是我们熟悉的装饰器语法糖用法@+名字,而它的作用就是将装饰的函数(类中定义的方法)伪装成一种属性(类中有两种特质,一是属性你也可以理解为不变的量,二是方法也就是多态变化的函数),那property具体是怎么做到这点呢?先来思考一个问题. 成人的BMI数值: 过轻:低于18.5 正常:18.5-23.9 过重:24-27 肥胖:28-32 非常肥胖, 高于32 体质指数(B

Mixins、多态、绑定方法与非绑定方法

一.Mixins机制 是一种命名规范,解决多继承中一个对象同时属于多个类的问题,Mixins机制的核心是在多继承背景下尽可能的提升代码的可读性,符合人类的思维:什么是什么. 拿交通工具来说,民航飞机.直升飞机.汽车都是属于交通工具.可以定义一个交通工具的父类,三者都可以继承这个父类,他们都有载客的功能.除了载客,飞机还能起飞.上天!!!,而汽车不行.显然民航飞机和直升机的飞行这个属性只是这两个交通工具的所特有的功能而已,在继承交通工具父类的同时可以用Mixins机制混入飞行这个功能,注意混入的只

python3 多态,绑定方法与非绑定方法

多态:同一种事物的不同形态(一个抽象类有多个子类,因而多态的概念依赖于继承) 1. 序列类型有多种形态:字符串,列表,元组. 2. 动物有多种形态:人,狗,猪 多态性:多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同功能的函数. 多态性的例子:obj具有多态性 # 以下例子可以概括:多态性就是一个接口(函数func()),多种实现(f.func())import abc class Animal(metaclass=abc.ABCMeta): @abc.abstr

走入计算机的第三十三天(异常处理和scoket编程)

一 异常处理 1 异常和错误,而错误分成了两种 一是语法错误,这种错误过不了解释器的检测,必须要在执行前改正 二是逻辑错误,在执行的时候检测出了错误. 2 什么是异常:异常就是程序在运行是产生的错误信息. 3 异常的种类 python3中不同的异常分为不同的类型,用不同的类型去标识.不同的类型对象错误都有相对应的标识语法. AssertionErr: 断言语句失败:关键字后边的条件为假的时候,程序将 停止并抛出AssertionError异常,语句一般是在测试程序的时候用于在代码中置入的检查点.

走入计算机的第三十四天(基于tcp和udp的套接字)

一 TCP套接字 1 low版TCP套接字 服务器端 客户端 2.改进版tcp套接字 服务端 客户端 二.UDP的套接字 服务器 客户端 注:udp的套接字可以支持多个客户端同时访问,但tcp套接字就不行了,那是因为tcp套接字有tcp三次握手四次挥手. 三.recv和recvfrom的区别? 1.提前须知: 1.1tcp是send发送消息,recv接收消息. 1.2udp是sendto发送消息,recvfrom接收消息. 1.3 在我眼里看来send只是发送一个数据对象,所以recv接收的也只

走入计算机的第三十九天(python终结篇之IO模型)

一.IO模型 1.IO模型分类 1.阻塞IO--------blocking IO 2.非阻塞IO------nonblocking IO 3. 多路复用IO------- multiplexing 4.信号驱动IO-------signal driven IO (工作中不会使用到,只是作为了解) 5.异步IO------- asynchronous IO 2.通常情况下IO默认操作分为两个阶段(默认都是阻塞IO) 1.准备等待数据阶段,相当于请求操作系统是否有数据发送过来(调用IO操作). 2