python 抽象类分析

最近在看bottle.py源码,里面自定了多个类字典的类。这些类的定义继承了collections中多个抽象类。比如MutableMapping。

1、在讲抽象类之前,先说下抽象方法的实现。

抽象方法是基类中定义的方法,但却没有任何实现。在java中,可以把方法申明成一个接口。而在python中实现一个抽象方法的简单的方法是:

?


1

2

3

class Sheep(object):

def get_size(self):

raise NotImplementedError

任何从Sheep继承下来的子类必须实现get_size方法。否则就会产生一个错误。但这种实现方法有个缺点。定义的子类只有调用那个方法时才会抛错。这里有个简单方法可以在类被实例化后触发它。使用python提供的abc模块。

?


1

2

3

4

5

6

7

import abc

class Sheep(object):

__metaclass__ = abc.ABCMeta

@abc.absractmethod

def get_size(self):

return

这里实例化Sheep类或任意从其继承的子类(未实现get_size)时候都会抛出异常。

因此,通过定义抽象类,可以定义子类的共同method(强制其实现)。

2、抽象类的定义。

python中,抽象类通过abc模块实现。

?


1

2

3

4

5

6

7

8

9

10

11

12

import abcclass PluginBase(object):

__metaclass__ = abc.ABCMeta

@abc.abstractmethod

def load(self, input):

"""Retrieve data from the input source and return an object."""

return

@abc.abstractmethod

def save(self, output, data):

"""Save the data object to the output."""

return

具体化抽象类,可以有两种方式,一种通过注册(register),另外一种通过继承。

注册方式:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

import abc

from abc_base import PluginBase

class RegisteredImplementation(object):

def load(self, input):

return input.read()

def save(self, output, data):

return output.write(data)PluginBase.register(RegisteredImplementation)

if __name__ == ‘__main__‘:

print ‘Subclass:‘, issubclass(RegisteredImplementation, PluginBase)

print ‘Instance:‘, isinstance(RegisteredImplementation(), PluginBase)

继承方式:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

import abc

from abc_base import PluginBase

class SubclassImplementation(PluginBase):

def load(self, input):

return input.read()

def save(self, output, data):

return output.write(data)

if __name__ == ‘__main__‘:

print ‘Subclass:‘, issubclass(SubclassImplementation, PluginBase)

print ‘Instance:‘, isinstance(SubclassImplementation(), PluginBase)

执行发现,注册方式和继承方式不同在于,注册方式,当没有实现抽象方法时,实例化时候不会报错,但调用时候会报错。

3、抽象类中除了抽象方法外,也可以实现抽象属性(@abstraproperty)。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

import abcclass Base(object):

__metaclass__ = abc.ABCMeta

@abc.abstractproperty

def value(self):

return ‘Should never get here‘class Implementation(Base):

@property

def value(self):

return ‘concrete property‘try:

b = Base()

print ‘Base.value:‘, b.valueexcept Exception, err:

print ‘ERROR:‘, str(err)i = Implementation()print ‘Implementation.value:‘, i.value

另外子类中抽象属性实现必须与抽象属性定义一致。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

import abc

class Base(object):

__metaclass__ = abc.ABCMeta

def value_getter(self):

return ‘Should never see this‘

def value_setter(self, newvalue):

return

value = abc.abstractproperty(value_getter, value_setter)

class PartialImplementation(Base):

@abc.abstractproperty

def value(self):

return ‘Read-only‘class Implementation(Base):

_value = ‘Default value‘

def value_getter(self):

return self._value

def value_setter(self, newvalue):

self._value = newvalue

value = property(value_getter, value_setter)try:

b = Base()

print ‘Base.value:‘, b.valueexcept Exception, err:

print ‘ERROR:‘, str(err)try:

p = PartialImplementation()

print ‘PartialImplementation.value:‘, p.valueexcept Exception, err:

print ‘ERROR:‘, str(err)i = Implementation()

print ‘Implementation.value:‘, i.valuei.value = ‘New value‘print ‘Changed value:‘, i.value

4、collections

collections模块定义了几个抽象类。

General container classes:

  • Container
  • Sized

Iterator and Sequence classes:

  • Iterable
  • Iterator
  • Sequence
  • MutableSequence

Unique values:

  • Hashable
  • Set
  • MutableSet

Mappings:

  • Mapping
  • MutableMapping
  • MappingView
  • KeysView
  • ItemsView
  • ValuesView

Miscelaneous:

  • Callable

    python的内置类型在import collections时,会自动被注册到这些类中。因此你可以安全的使用isinstance或issubclass来保证执行某些api

时间: 2024-10-05 04:09:42

python 抽象类分析的相关文章

python日志分析

微秒   毫秒 datetime seek定位指针 从行尾到行首 fd.seek(-2,1)  1  当前位置 fd.tell() fd.seek(-2,2)  2   最后位置 fd.tell() fd.seek(0,0)   0  最前位置 read(1)读一位    read() 全部都读 tac与cat    行首到行尾 reversed   翻转字符串 只读一部分    通过时间判断 200 404  503  十分钟之内   第八列  apache.log 1.首先匹配时间格式, D

Python代码分析工具:PyChecker、Pylint

1 概述 PyChecker是Python代码的静态分析工具,它能够帮助查找Python代码的bug,而且能够对代码的复杂度和格式等提出警告. PyChecker可以工作在多种方式之下.首先,PyChecker会导入所检查文件中包含的模块,检查导入是否正确,同时检查文件中的函数.类和方法等. PyChecker可以检查出来的问题有如下几种: 全局量没有找到,比如没有导入模块 传递给函数.方法.构造器的参数数目错误 传递给内建函数和方法的参数数目错误 字符串格式化信息不匹配 使用不存在的类方法和属

Python性能分析指南(未完成)

英文原文:http://www.huyng.com/posts/python-performance-analysis/ 译文:http://www.oschina.net/translate/python-performance-analysis 虽然你所写的每个Python程序并不总是需要严密的性能分析,但是当这样的问题出现时,如果能知道Python生态系统中的许多种工具,这样总是可以让人安心的. 分析一个程序的性能可以归结为回答4个基本的问题: 1.它运行的有多块? 2.那里是速度的瓶颈?

第五次作业——python效能分析与几个问题(个人作业)

第五次作业--效能分析与几个问题(个人作业) 前言 阅读了大家对于本课程的目标和规划之后,想必很多同学都跃跃欲试,迫不及待想要提高自身实践能力,那么就从第一个个人项目开始吧,题目要求见下. 阅读 阅读<构建之法>第一章至第三章的内容,并在下方作业里体现出阅读后的成果.特别是第2章中的效能分析及个人软件开发流程(PSP). 参考文章: <构建之法>教学笔记--Python中的效能分析与几个问题 四则运算器效能分析 软工第2次作业-四则运算器 题目描述 可以选择以下题目(或者自主选择题

Python大佬分析了15万歌词,告诉你民谣歌手们到底在唱什么

前几天小编写了两篇利用Python采集网易云歌词和采集网易云音乐歌曲文章,相信小伙伴们经过实践之后都能够顺利的采集到自己想要听的歌曲.下面的歌词是小编去年11月份采集的民谣歌词,经过统计,歌词量达到将近15万. 用Python采集的民谣歌词 心血来潮,想利用Python来分析一下民谣歌手们到底在唱些什么鬼~~ 首先运用jieba库进行分词和词频统计分析,得到歌词中的词频统计,部分主要代码如下图所示: 运用jieba库进行分词和词频统计分析 得到的词频后将其导入到Excel表格中,详情如下图: 民

Python性能分析

Python性能分析 https://www.cnblogs.com/lrysjtu/p/5651816.html https://www.cnblogs.com/cbscan/articles/3341231.html 使用ipdb 使用profile import profile def profileTest(): Total =1; for i in range(10): Total=Total*(i+1) print Total return Total if __name__ ==

Python性能分析工具Profile

Python性能分析工具Profile 代码优化的前提是需要了解性能瓶颈在什么地方,程序运行的主要时间是消耗在哪里,对于比较复杂的代码可以借助一些工具来定位,python 内置了丰富的性能分析工具,如 profile,cProfile 与 hotshot 等.其中 Profiler 是 python 自带的一组程序,能够描述程序运行时候的性能,并提供各种统计帮助用户定位程序的性能瓶颈.Python 标准模块提供三种 profilers:cProfile,profile 以及 hotshot. p

Python代码分析工具之dis模块

转自:http://hi.baidu.com/tinyweb/item/923d012e8146d00872863ec0  ,格式调整过. 代码分析不是一个新的话题,代码分析重要性的判断比较主观,不同的人有不同的认识.Python是用C来实现的,所以对于Python的性能或代码质量的评估可以通过dis模块获取到对应的字节码指令来进行评估. Python代码是先被编译为Python字节码后,再由Python虚拟机来执行Python字节码(pyc文件主要就是用于存储字节码指令 的).一般来说一个Py

python抽象类+抽象方法实现接口(interface)

#python没有类似于java和C#的接口类(interface),需要使用抽象类 和抽象方法来实现接口功能 #!/usr/bin/env python#_*_ coding:utf-8 _*_ from abc import ABCMetafrom abc import abstractmethod class Alert: __metaclass__= ABCMeta @abstractmethod def send(self): pass #继承抽象类class Weixin(Alert