python基础之多态与多态性、绑定方法和非绑定方法
多态与多态性
多态
多态并不是一个新的知识
多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承
举个栗子:动物有多种形态,人、狗、猫、猪等,python的序列数据类型有字符串、列表、元组,文件的类型分为普通文件和可执行文件,人类又有多种形态,男女老少。。等等例子
1 import abc
2 class Animal(metaclass=abc.ABCMeta): #模拟动物类
3 @abc.abstractmethod
4 def talk(self):
5 pass
6 class People(Animal): #模拟人类
7 def talk(self):
8 print('say hello world')
9 class Cat(Animal): #模拟猫类
10 def talk(self):
11 print('say miaomiaomiao')
12 class Dog(Animal): #模拟狗类
13 def talk(self):
14 print('say wangwangwang')
动物都能叫,所以人类、猫类、狗类也都可以叫,只不过叫的方式不一样。
多态性:
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用到不同功能的函数。
在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息(!!!obj.func():是调用了obj的方法func,又称为向obj发送了一条消息func),不同的对象在接收时会产生不同的行为(即方法)
多态性实际上就是一个接口,即调用同一个函数,产生不同的结果。
示例1:使用数据对象的__len__属性统计对象长度
1 def func(obj):
2 obj.__len__()
3 func('hello')
4 func([1,2,3,4])
5 func(('a','b','c'))
示例2:
1 import abc
2 class Animal(metaclass=abc.ABCMeta): #模拟动物类
3 @abc.abstractmethod
4 def talk(self):
5 pass
6 class People(Animal): #模拟人类
7 def talk(self):
8 print('say hello world')
9 class Cat(Animal): #模拟猫类
10 def talk(self):
11 print('say miaomiaomiao')
12 class Dog(Animal): #模拟狗类
13 def talk(self):
14 print('say wangwangwang')
15
16 p1=People()
17 c1=Cat()
18 d1=Dog()
19
20 def talk(obj): #多态性
21 obj.talk()
22 talk(p1)
23 talk(c1)
24 talk(d1)
多态性的优点1:以不变应万变,统一调用接口,使用者只用一种调用方式即可
多态性的优点2:增加扩展性,比如上述代码再加一个Pig类,调用talk功能的方式不会改变,就是talk(Pig对象)
绑定方法与非绑定方法
类中定义的函数分为两类:绑定方法和非绑定方法
绑定方法:绑定给谁就给谁用,可以是对象,也可以是类本身。
绑定到对象的方法:
定义:凡是在类中定义的函数(没有被任何装饰器修饰),都是绑定给对象的,无论有有没有传参
给谁用:给对象用
特点:例如obj.bar() 自动把obj当做第一个参数传入,因为bar中的逻辑就是要处理obj这个对象
示例:
1 class People:
2 def __init__(self, name, weight, height):
3 self.name = name
4 self.weight = weight
5 self.height = height
6 def bmi(self): #绑定到对象,需要传入对象的名字,而类本身是无法使用的,如果硬要使用,也需要把对象名字传进来
7 print(self.weight / (self.height ** 2))
8 f = People('bob', 70, 1.80)
9 f.bmi() #绑定对象使用的方法
10 People.bmi(f) #类使用需要传入对象名字
绑定到类的方法:
定义:在类中定义的,被classmethod装饰的函数就是绑定到类的方法
给谁用:给类用
特点:例如People.talk() 自动把类当做第一个参数传入,因为talk中的逻辑就是要处理类
注意:自动传值只是使用者意淫的,属于类的函数,类可以调用,但是必须按照函数的规则来,在任何过程中都没有自动传值那么一说,传值都是事先定义好的,只不过使用者感知不到。
示例1:
1 class People:
2 def __init__(self,name):
3 self.name=name
4 def bar(self):
5 print('Object name:',self.name)
6 @classmethod #将方法绑定给类People
7 def func(cls): #传入的值只能是类的名字
8 print('Class name:',cls)
9 f=People('natasha')
10 print(People.func) #绑定给类
11 print(f.bar) #绑定给对象
12 People.func() #类调用绑定到类的方法
13 f.func() #对象调用绑定到类的方法,打印的依然是类的名字
输出结果:
1 <bound method People.func of <class '__main__.People'>> #绑定到类的方法
2 <bound method People.bar of <__main__.People object at 0x0000026FC4109B38>> #绑定到对象的方法
3 Class name: <class '__main__.People'> #类调用返回类名
4 Class name: <class '__main__.People'> #对象调用返回类名
非绑定方法:
用staticmethod装饰器装饰的方法,非绑定方法不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已
注意:没有传值的普通函数并不是非绑定方法,只有被staticmethod装饰的才是非绑定方法。
示例
1 import hashlib
2 import pickle
3 import os
4 # 模拟注册,生成一个唯一id标识
5 student_path=r'C:\Users\Mr.chai\Desktop\PythonProject\笔记\2017.7.6\db'
6
7 class People:
8 def __init__(self,name,sex,user_id):
9 self.name=name
10 self.sex=sex
11 self.user_id=user_id
12 self.id=self.create_id()
13 def tell_info(self): #打印所有信息
14 print('''
15 =====%s info=====
16 id:%s
17 name:%s
18 sex:%s
19 user_id:%s
20 ''' %(self.name,self.id,self.name,self.sex,self.user_id))
21 def create_id(self): #生成一个id号,对name、sex和user_id进行哈希
22 m=hashlib.md5()
23 m.update(self.name.encode('utf-8'))
24 m.update(self.sex.encode('utf-8'))
25 m.update(str(self.user_id).encode('utf-8'))
26 return m.hexdigest()
27 def save(self): #将id号序列化到文件,以id号为文件名字
28 idfile_path=student_path+'\\'+self.id
29 with open(idfile_path,'wb') as f:
30 pickle.dump(self,f)
31 @staticmethod #反序列化程序,是一个非绑定方法,无关类和对象
32 def get_all():
33 res=os.listdir(student_path)
34 for item in res:
35 file_path = r'%s\%s' %(student_path,item)
36 with open(file_path,'rb') as f:
37 obj = pickle.load(f)
38 obj.tell_info()
测试:生成序列化文件
1 #实例化对象
2 p1=People('natasha','male',370283111111111111)
3 p2=People('hurry','male',3702832222222222222)
4 p3=People('bob','male',3702833333333333333)
5 #查询唯一标识
6 print(p1.id)
7 print(p2.id)
8 print(p3.id)
9 #对象pickle序列化
10 p1.save()
11 p2.save()
12 p3.save()
13
14 查询输出:
15 b4ea1e1f1e45428ee16035e101caac7b
16 274496ab60ceea8bf4c89c841d2b225c17 0defdb74fdee00f2164839343c16a7d7
生成文件
反序列化:
1 p1.get_all()
2 # p2.get_all()
3 # p3.get_all()
4
5 输出结果
6
7 =====bob info=====
8 id:0defdb74fdee00f2164839343c16a7d7
9 name:bob
10 sex:male
11 user_id:3702833333333333333
12
13
14 =====hurry info=====
15 id:274496ab60ceea8bf4c89c841d2b225c
16 name:hurry
17 sex:male
18 user_id:3702832222222222222
19
20
21 =====natasha info=====
22 id:b4ea1e1f1e45428ee16035e101caac7b
23 name:natasha
24 sex:male
25 user_id:370283111111111111
26
python基础之多态与多态性、绑定方法和非绑定方法的更多相关文章
- Python基础之多态与多态性
切记:不要将多态与多态性这二者混为一谈,只要分开,就会很明朗了. 一.多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承). 比如:动物分为人类.狗类.猪类(在定义角 ...
- Python开发基础-Day21多态与多态性、绑定方法和非绑定方法
多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类 ...
- python基础18 ---多态与绑定方法
一.抽象类 1.抽象类的定义:从一堆类中抽象出相同的内容,重新组成一个新的类,这样的类属于抽象类. 2.香蕉类是一类水果,苹果类是一类水果,葡萄类是一类水果,但是他们都属于水果,从他们这些类中可以抽象 ...
- Python--多态与多态性、绑定方法与非绑定方法
多态与多态性 多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承) 1. 序列类型有多种形态:字符串,列表,元组. s='hello' l=[,,] t=('a',' ...
- 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
- 全面解析python类的绑定方法与非绑定方法
类中的方法有两类: 绑定方法 非绑定方法 一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. ...
- Python面向对象之封装、property特性、绑定方法与非绑定方法
一.封装 ''' 1.什么封装 封:属性对外是隐藏的,但对内是开放的(对内是开放的是因为在类定义阶段这种隐藏已经发生改变) 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装 封装数据属 ...
- 类的封装,property特性,类与对象的绑定方法和非绑定方法,
类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...
- Day 5-5 绑定方法与非绑定方法
绑定方法与非绑定方法: 在类内部定义的绑定方法,分两大类: classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入 ...
随机推荐
- Android 接入支付宝支付实现
接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...
- SQL Server 2008 角色
固定服务器角色:按照从最低级别的角色(bulkadmin)到最高级别的角色(sysadmin)的顺序进行描述:Bulkadmin:这个服务器角色的成员可以运行BULK INSERT语句.这条语句允许从 ...
- [RDLC]心得整理(一)
2014年在做项目的时候, 过用过RDLC, 之后便在没有使用过了. 最近又有项目使用rdlc, 感觉有些陌生,然后重新阅读了以前的笔记,想做一下整理. 常见问题: 1. 为什么rdlc报表出来的pd ...
- 利用ASP.NET里自带的站点地图工具制作网站站点地图
站点地图很方便能快速给我们导航我们要去访问的地址,能按层级关系分门别类,给用户一个很好的用户体验,很好的看到自己当前所在的网站位置 站点地图,又称网站地图,它就是一个页面,上面放置了网站上所有页面的链 ...
- [转]Android解析json数据
1.json格式 2.json解析 3.gson解析 4.fastjson解析 一.Json格式 json一种轻量级的数据交换格式.在网络上传输交换数据一般用xml, json. 两种结构: 1)对象 ...
- 02、体验Spark shell下RDD编程
02.体验Spark shell下RDD编程 1.Spark RDD介绍 RDD是Resilient Distributed Dataset,中文翻译是弹性分布式数据集.该类是Spark是核心类成员之 ...
- Python基础学习之集合
集合是一个无序.不重复的数据集合,它的主要作用如下: 去重:把一个列表变成集合,就可以去除重复的内容 关系测试:测试两组数据之间的交集.并集.差集等关系 集合常用的操作: #创建一个数值集合 s=se ...
- COGS 146. [USACO Jan08] 贝茜的晨练计划
★☆ 输入文件:cowrun.in 输出文件:cowrun.out 简单对比时间限制:1 s 内存限制:32 MB 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运 ...
- HTML入门2—HTML常用标签
HTML常用标签练习 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- 模仿ArcGIS用Graphics重绘的直方图分级调节器
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...