python 抽象类分析
2014-02-19 00:00
218 查看
摘要: python抽象类
最近在看bottle.py源码,里面自定了多个类字典的类。这些类的定义继承了collections中多个抽象类。比如MutableMapping。
1、在讲抽象类之前,先说下抽象方法的实现。
抽象方法是基类中定义的方法,但却没有任何实现。在java中,可以把方法申明成一个接口。而在python中实现一个抽象方法的简单的方法是:
任何从Sheep继承下来的子类必须实现get_size方法。否则就会产生一个错误。但这种实现方法有个缺点。定义的子类只有调用那个方法时才会抛错。这里有个简单方法可以在类被实例化后触发它。使用python提供的abc模块。
这里实例化Sheep类或任意从其继承的子类(未实现get_size)时候都会抛出异常。
因此,通过定义抽象类,可以定义子类的共同method(强制其实现)。
2、抽象类的定义。
python中,抽象类通过abc模块实现。
具体化抽象类,可以有两种方式,一种通过注册(register),另外一种通过继承。
注册方式:
继承方式:
执行发现,注册方式和继承方式不同在于,注册方式,当没有实现抽象方法时,实例化时候不会报错,但调用时候会报错。
3、抽象类中除了抽象方法外,也可以实现抽象属性(@abstraproperty)。
另外子类中抽象属性实现必须与抽象属性定义一致。
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
最近在看bottle.py源码,里面自定了多个类字典的类。这些类的定义继承了collections中多个抽象类。比如MutableMapping。
1、在讲抽象类之前,先说下抽象方法的实现。
抽象方法是基类中定义的方法,但却没有任何实现。在java中,可以把方法申明成一个接口。而在python中实现一个抽象方法的简单的方法是:
class Sheep(object): def get_size(self): raise NotImplementedError
任何从Sheep继承下来的子类必须实现get_size方法。否则就会产生一个错误。但这种实现方法有个缺点。定义的子类只有调用那个方法时才会抛错。这里有个简单方法可以在类被实例化后触发它。使用python提供的abc模块。
import abc class Sheep(object): __metaclass__ = abc.ABCMeta @abc.absractmethod def get_size(self): return
这里实例化Sheep类或任意从其继承的子类(未实现get_size)时候都会抛出异常。
因此,通过定义抽象类,可以定义子类的共同method(强制其实现)。
2、抽象类的定义。
python中,抽象类通过abc模块实现。
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),另外一种通过继承。
注册方式:
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)
继承方式:
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)。
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
另外子类中抽象属性实现必须与抽象属性定义一致。
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
相关文章推荐
- Python爬取B站弹幕代码分析
- ubuntu下搭建python数据分析环境
- Python数据分析 EPD
- 金融时间序列分析:8. MA模型实例(Python)
- python数据分析与挖掘项目实战记录
- Python抓取框架 Scrapy 的架构分析
- python使用urlparse分析网址中域名的方法
- Python seaborn matplotlib 对数据进行图表分析
- 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
- Python中property函数用法实例分析
- 用Python的sklearn库进行PCA(主成分分析)
- Python中使用MELIAE分析程序内存占用实例
- 用Python做数据分析初探(二)
- python 中文乱码问题深入分析
- python的多线程分析
- 粗略分析Python中的内存泄漏
- python中input()与raw_input()的区别分析
- Python玩转数据分析学习笔记-05数据
- Python运算符重载用法实例分析
- python 入门学习之 python 特点分析