今日内容

  1. type和class
  2. 继承
    • 抽象类
    • 接口类
  3. 多态
    • java
    • 鸭子类型
  4. pickle模块
  5. 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-抽象类与接口类的更多相关文章

  1. php 抽象类和接口类

    PHP中抽象类和接口类都是特殊类,通常配合面向对象的多态性一起使用. 相同: ①两者都是抽象类,都不能实例化. ②只有接口类的实现类和抽象类的子类实现了 已经声明的 抽象方法才能被实例化. 不同: ① ...

  2. python之路----继承的抽象类和接口类

    抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...

  3. Python抽象类和接口类

    一.抽象类和接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名) ...

  4. python基础 抽象类(接口类)

    Python中没有接口.接口类,抽象类:定义 制定一个规范 #必须要导入from abc import ABCMeta,abstractmethod class Payment(metaclass = ...

  5. 抽象类,接口类,封装,property,classmetod,statimethod

    抽象类,接口类,封装,property,classmetod,statimethod(类方法,静态方法) 一丶抽象类和接口类 接口类(不崇尚用) 接口类:是规范子类的一个模板,只要接口类中定义的,就应 ...

  6. python's twenty-first day for me 抽象类和接口类以及多态

    归一化设计: 不管是哪一个类的对象,都调用同一个函数去完成相似的功能. class Alipay: def pay(self,money): print('使用支付宝支付了%s' % money) c ...

  7. Python面向对象 | 抽象类和接口类

    一.抽象类(规范的编程模式) 什么是抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化.抽象类的本质还是类,指的是一组类的相似性,而接口只强调函数属性的相似性. 为什么要有抽象类 ...

  8. PHP的抽象类、接口类的区别和选择【转载】

    本文转自:http://blog.csdn.net/fanteathy/article/details/7309966 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关 ...

  9. python 抽象类和接口类

    一.接口类 继承的两种用途: 1.继承基类的方法,并且做出自己的改变或者扩展(代码重用) 2.声明某个子类兼容于某个基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数 名)  ...

  10. abstract class和interface 抽象类与接口类的区别

    抽象类与类型定义相关: 接口类与行为规范相关: 接口类不是类型. 抽象类:是不完整的类,函数实现未定义:可以继承,不可以实例化. 接口类:接口类不是类:是类间交互的规范:不能继承.不能实例化,只能实现 ...

随机推荐

  1. loj#528. 「LibreOJ β Round #4」求和

    求:\(\sum_{i=1}^n\sum_{j=1}^m\mu(gcd(i,j))^2\) 化简可得\(\sum_{i=1}^{min(n,m)}{\lfloor \frac{n}{i} \rfloo ...

  2. java解析前端请求接口的全部入参

    第一种: public static String getRequestInput(HttpServletRequest request) { StringBuilder sb = new Strin ...

  3. ubuntu开启慢日志

    ubuntu 开启mysql日志记录 1.找到mysql的配置文件sudo vim /etc/mysql/my.cnf将下面两行的#去掉#general_log_file = /var/log/mys ...

  4. java利用jxl实现Excel导入功能

    本次项目实践基于Spring+SpringMvc+MyBatis框架,简单实现了Excel模板导出.和Excel批量导入的功能.实现过程如下:. 1.maven导入所需jar包 <depende ...

  5. sql百万级查询优化(转)

    < 数据库技术内幕 > 处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进 ...

  6. pycharm下打开、执行并调试scrapy爬虫程序

    首先得有一个Scrapy项目,我在Desktop上新建一个Scrapy的项目叫test,在Desktop目录打开命令行,键入命令:scrapy startproject test1  目录结构如下: ...

  7. CRM WEB UI 02搜索跳转到详细界面

    结合上一个,在上一个中,创建的是选择链接字段EBELN. 下面来实现点击EBELN跳转到详细界面: 1.创建ZLYTEST03_H组件,做详细界面. 2.创建概览页 DETOV. 3.创建视图集 DE ...

  8. Spring注解之 @SuppressWarnings注解

    简介:java.lang.SuppressWarnings是J2SE5.0中标准的Annotation之一.可以标注在类.字段.方法.参数.构造方法,以及局部变量上.作用:告诉编译器忽略指定的警告,不 ...

  9. 【LeetCode】二分查找

    给一个升序数组,找到目标值在数组中的起始和结束位置,时间复杂度为 O(log n). e.g. 给定数组 [5, 7, 7, 8, 8, 10] 和目标值 8,返回 [3, 4].若目标值不在数组中, ...

  10. Visual Studio references中的package找不到

    1. 把solution里面所有project的.net版本设成一样的 2. ERROR: This project references NuGet package(s) that are miss ...