2019-03-28-day021-抽象类与接口类
今日内容
- type和class
- 继承
- 抽象类
- 接口类
- 多态
- java
- 鸭子类型
- pickle模块
- collections.namedtuple
type和class
##type
##class
print(type(123))
class Course:
def __init__(self,name,price):
self.name = name
self.price = price
python = Course('python',20000)
print(type(python))
type一个对象的时候,结果总是这个对象所属的类
类是什么类型???所有的类的类型都是type
print(type(Course))
print(type(int))
print(type(str))
- 对象是被创造出来 被类实例化出来的
- 类也是被创造出来的 特殊的方式来创造类
- 常规创造的类 总是有几个特性
- 能够实例化
- 能有属性
- 能有方法
- 元类 能够帮助你创造不同寻常的类
- 特殊的需求一 : 不能实例化
- 特殊的需求二 : 只能有一个实例
- 类 = type(对象)
- type = type(类)
- 所有的类型 说的都是这个对象是属于哪一个类的
- 所有的用class常规语法创造出来的类 都是type类型
- 进阶
- 元类 :是能够帮助我们创造一些有特殊要求的类
抽象类
微信支付
支付宝支付
class Wechatpay:
def __init__(self,name,money):
self.name = name
self.money = money
def pay(self):
print('%s通过微信支付了%s元'%(self.name,self.money))
class Alipay:
def __init__(self,name,money):
self.name = name
self.money = money
def pay(self):
print('%s通过支付宝支付了%s元'%(self.name,self.money))
class ApplePay:
def __init__(self,name,money):
self.name = name
self.money = money
def fuqian(self):
print('%s通过apple pay支付了%s元' % (self.name, self.money))
归一化设计
def pay(person):
person.pay()
wcp = Wechatpay('alex',2000000)
pay(wcp)
ali = Alipay('alex',2000000)
app = ApplePay('alex',2000000)
pay(app)
代码的规范没有建立起来
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta): # 抽象类
@abstractmethod # 如果我必须要实现pay方法,那么我需要给pay加一个装饰器
def pay(self):
pass # 创建的这个pay并没有内容,
# 之所以写一个pay是为了提醒所有子类你一定要实现一个pay方法
@abstractmethod
def back(self):
pass
class Wechatpay(Payment):
def __init__(self,name,money):
self.name = name
self.money = money
def pay(self):
print('%s通过微信支付了%s元'%(self.name,self.money))
class Alipay(Payment):
def __init__(self,name,money):
self.name = name
self.money = money
def pay(self):
print('%s通过支付宝支付了%s元'%(self.name,self.money))
class ApplePay(Payment):
def __init__(self, name, money):
self.name = name
self.money = money
def pay(self):
print('%s通过apple pay支付了%s元' % (self.name, self.money))
def back(self):
print('退款')
归一化设计
def pay(person):
person.pay()
ApplePay('alex',20000)
- 抽象类 :Payment这个类是一个抽象类
- 抽象类做什么事儿 : 约束所有的子类 必须实现被abstractmethod装饰的方法名
给我们的代码指定规范
- 特点 : 抽象类不能实例化,只是作为具体的类的规范
抽象类长什么样
class 类名(metaclass = 'ABCMeta'):
@abstractmethod
def 规定的方法名(self):pass
@abstractmethod
def 规定的方法名(self):pass
@abstractmethod
def 规定的方法名(self):pass
接口类
类只能单继承,所以抽象类 只能是所有的子类只有一个规范
- java 当中没有多继承的类
- 接口 接口可以多继承
- 在python里没有接口的专用语法
- 我们只是通过类的多继承 模仿接口的效果
from abc import ABCMeta,abstractmethod
class NormalAnnimal(metaclass=ABCMeta):
@abstractmethod
def eat(self):pass
@abstractmethod
def drink(self):pass
class FlyAnimal(metaclass=ABCMeta):
@abstractmethod
def fly(self):pass
class SwimAnimal(metaclass=ABCMeta):
@abstractmethod
def swim(self):pass
class WalkAnimal(metaclass=ABCMeta):
@abstractmethod
def walk(self):pass
class Frog(NormalAnnimal,SwimAnimal,WalkAnimal):
def eat(self):
pass
class Tiger(NormalAnnimal,SwimAnimal,WalkAnimal):pass
class Swan(NormalAnnimal,FlyAnimal,SwimAnimal,WalkAnimal):pass
class Parrot(NormalAnnimal,FlyAnimal,WalkAnimal):
def talk(self):
pass
抽象类 是单继承的规范
接口类 是多继承的规范
- java
- 接口里面定义的所有的方法 都不能写具体的实现 pass
- 抽象类里面定义的所有的抽象方法 内部是可以完成一些简单的代码
多态
在python当中 处处是多态,一切皆对象
广义的多态:
- 一个类能表现出的多种形态
- 木头
- 高桌子
- 低板凳
====== - 用户
- vip用户
- svip用户
三大特性中的多态
- java
def func(str username,str password):
username.strip()
def pow(int a,int b):
return a**b
pow('a','b')
#例子
class Payment:pass
class Alipay(Payment):
def __init__(self,name,money):
self.name = name
self.money = money
def pay(self):
print('%s通过支付宝支付了%s元'%(self.name,self.money))
class ApplePay(Payment):
def __init__(self,name,money):
self.name = name
self.money = money
def pay(self):
print('%s通过apple pay支付了%s元' % (self.name, self.money))
归一化设计
def pay(Payment person):
person.pay()
#支付有多种形态 : 支付宝 微信支付 apple支付
鸭子类型
class 序列:
def __len__(self):
pass
class list(序列):
def __init__(self):
self.length = 0
def __len__(self):
return self.length
def len(序列 obj):
- list
- str
- dict
- tuple
- set
class Person:pass
class Teacher(Person):pass
taibai = Teacher()
print(isinstance(taibai,Person))
print(isinstance(taibai,Teacher))
python
啥也不用
是不是一个迭代器
__iter__ __next__
len()
__len__()
- 鸭子类型
- python当中写程序的一种特殊的情况
- 其他语言中 正常的我们说一个数据类型具有某个特点,通常是通过继承来实现
- 继承迭代器类,来证明自己本身是个迭代器
- 继承可哈希的类,来证明自己本事是可哈希的
- 但是所有的这些都不是通过继承来完成的
- 我们只是通过一种潜规则的约定,如果具有__iter__,__next__就是迭代器
- 如果具有__hash__方法就是可哈希
- 如果具有__len__就是可以计算长度的
- 这样数据类型之间的关系并不仅仅是通过继承来约束的
- 而是通过约定俗成的关系来确认的
- 多态
- 在传递参数的时候,如果要传递的对象有可能是多个类的对象
- 我们又必须在语言中清楚的描述出到底是那一个类型的对象
- 我们就可以使用继承的形式,有一个父类作为这些所有可能被传递进来的对象的基类
- 基础类型就可以写成这个父类
- 于是所有子类的对象都是属于这个父类的
- 在python当中,因为要传递的对象的类型在定义阶段不需要明确,所以我们在python中处处都是多态
- 数据的类型不需要通过继承来维护统一
- 在传递参数的时候,如果要传递的对象有可能是多个类的对象
namedtuple
from collections import namedtuple
Course = namedtuple('Course',['name','price','period'])
python = Course('python',20000,'6 month')
print(python.name)
print(python.price)
print(python.period)
print(type(python))
pickle
import pickle
class Course:
def __init__(self,name,price,period):
self.name = name
self.price = price
self.period = period
python = Course('python',20000,'6 months')
linux = Course('linux',15800,'5 months')
import pickle
with open('pickle_file','ab') as f:
pickle.dump(python,f)
pickle.dump(linux,f)
import pickle
with open('pickle_file','rb') as f:
# obj1 = pickle.load(f)
# obj2 = pickle.load(f)
while True:
try:
obj = pickle.load(f)
print(obj.__dict__)
except EOFError:
break
2019-03-28-day021-抽象类与接口类的更多相关文章
- php 抽象类和接口类
PHP中抽象类和接口类都是特殊类,通常配合面向对象的多态性一起使用. 相同: ①两者都是抽象类,都不能实例化. ②只有接口类的实现类和抽象类的子类实现了 已经声明的 抽象方法才能被实例化. 不同: ① ...
- python之路----继承的抽象类和接口类
抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...
- Python抽象类和接口类
一.抽象类和接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名) ...
- python基础 抽象类(接口类)
Python中没有接口.接口类,抽象类:定义 制定一个规范 #必须要导入from abc import ABCMeta,abstractmethod class Payment(metaclass = ...
- 抽象类,接口类,封装,property,classmetod,statimethod
抽象类,接口类,封装,property,classmetod,statimethod(类方法,静态方法) 一丶抽象类和接口类 接口类(不崇尚用) 接口类:是规范子类的一个模板,只要接口类中定义的,就应 ...
- python's twenty-first day for me 抽象类和接口类以及多态
归一化设计: 不管是哪一个类的对象,都调用同一个函数去完成相似的功能. class Alipay: def pay(self,money): print('使用支付宝支付了%s' % money) c ...
- Python面向对象 | 抽象类和接口类
一.抽象类(规范的编程模式) 什么是抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化.抽象类的本质还是类,指的是一组类的相似性,而接口只强调函数属性的相似性. 为什么要有抽象类 ...
- PHP的抽象类、接口类的区别和选择【转载】
本文转自:http://blog.csdn.net/fanteathy/article/details/7309966 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关 ...
- python 抽象类和接口类
一.接口类 继承的两种用途: 1.继承基类的方法,并且做出自己的改变或者扩展(代码重用) 2.声明某个子类兼容于某个基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数 名) ...
- abstract class和interface 抽象类与接口类的区别
抽象类与类型定义相关: 接口类与行为规范相关: 接口类不是类型. 抽象类:是不完整的类,函数实现未定义:可以继承,不可以实例化. 接口类:接口类不是类:是类间交互的规范:不能继承.不能实例化,只能实现 ...
随机推荐
- MySQL 处理海量数据时一些优化查询速度方法
1.应尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by设计的列上建立 ...
- 509. Fibonacci Number斐波那契数列
网址:https://leetcode.com/problems/fibonacci-number/ 原始的斐波那契数列 运用自底向上的动态规划最佳! 可以定义vector数组,但是占用较多内存空间 ...
- Hadoop 2.7.3 完全分布式维护-部署篇
测试环境如下 IP host JDK linux hadop role 172.16.101.55 sht-sgmhadoopnn-01 1.8.0_111 CentOS release ...
- ECharts 报表事件联动系列二:柱状图,饼状图添加事件
代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...
- 【Java】XML
一.XML XML(Extensible Markup Language),可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言. 格式: <?xml version="1. ...
- JavaScript基础(四)
十六.client.offset.scroll系列 1.client系列 代码如下: <!DOCTYPE html> <html> <head> <meta ...
- Liunx 更新环境时用到的命令
1.进入项目文件所在位置:cd/home/zhaorg/shelly62/apache-tomcat-7.0.5.2/bin 2.关闭服务:./shuntdown.sh或者 sh.shuntdown. ...
- ForkJoin
Java Fork/Join 框架 jdk1.8-ForkJoin框架剖析 Java的Fork/Join任务,你写对了吗? 概述 从JDK1.7开始,Java提供Fork/Join框架用于并行执行任务 ...
- CentOS查询系统版本
1.cat /proc/version 2.cat /etc/redhat-release 3.cat /proc/version 4.uname -a
- API设计和命名
1.前言 对于前端开发而言,肯定会和API打交道,大家也都会想过怎么设计自己的API.优秀的 API 之于代码,就如良好内涵对于每个人.好的 API 不但利于使用者理解,开发时也会事半功倍,后期维护更 ...