Python高级:了解Python ABC(抽象基类)及 应用场景
通用做法。
@six.add_metaclass(MetaClass) 的作用是在不同版本的Python之间提供一个优雅的声明类的metaclass的手段,事实上不用它也可以,只是使用了它代码更为整洁明了。
|
import six
@six.add_metaclass(Meta)
class MyClass(object):
pass
|
在Python 3 等价于 |
import six
class MyClass(object, metaclass = Meta):
pass
|
在Python 2.x (x >= 6)中等价于 |
import six
class MyClass(object):
__metaclass__ = Meta
pass
|
或者直接调用装饰器,
这里也能看出来装饰器就是个方法包装而已。
|
import six
class MyClass(object):
pass
MyClass = six.add_metaclass(Meta)(MyClass)
|
import abc
import six
@six.add_metaclass(abc.ABCMeta)
class BaseClass(object):
@abc.abstractmethod
def func_a(self, data):
"""
an abstract method need to be implemented
"""
@abc.abstractmethod
def func_b(self, data):
"""
another abstract method need to be implemented
"""
class SubclassImpl(BaseClass):
def func_a(self, data):
print("Overriding func_a, " + str(data))
@staticmethod
def func_d(self, data):
print(type(self) + str(data))
class RegisteredImpl(object):
@staticmethod
def func_c(data):
print("Method in third-party class, " + str(data))
BaseClass.register(RegisteredImpl)
if __name__ == '__main__':
for subclass in BaseClass.__subclasses__():
print("subclass of BaseClass: " + subclass.__name__)
print("subclass do not contains RegisteredImpl")
print("-----------------------------------------------")
print("RegisteredImpl is subclass: " + str(issubclass(RegisteredImpl, BaseClass)))
print("RegisteredImpl object is instance: " + str(isinstance(RegisteredImpl(), BaseClass)))
print("SubclassImpl is subclass: " + str(issubclass(SubclassImpl, BaseClass)))
print("-----------------------------------------------")
obj1 = RegisteredImpl()
obj1.func_c("RegisteredImpl new object OK!")
print("-----------------------------------------------")
obj2 = SubclassImpl() #由于没有实例化所有的方法,所以这里会报错 Can't instantiate abstract class SubclassImpl with abstract methods func_b
obj2.func_a("It's right!")
|
结果如下:
subclass of BaseClass: SubclassImpl
subclass do not contains RegisteredImpl
-----------------------------------------------
RegisteredImpl is subclass: True
RegisteredImpl object is instance: True
SubclassImpl is subclass: True
-----------------------------------------------
Method in third-party class, RegisteredImpl new object OK!
-----------------------------------------------
Traceback (most recent call last):
File "/Users/wangqi/Git/Python/scrapy_crawler_learn/test/ABCTest.py", line 51, in <module>
obj2 = SubclassImpl() #由于没有实例化所有的方法,所以这里会报错 Can't instantiate abstract class SubclassImpl with abstract methods func_b
TypeError: Can't instantiate abstract class SubclassImpl with abstract methods func_b
|
1. #我们去检查某个类是否有某种方法
class Company(object):
def __init__(self, employee_list):
self.employee = employee_list
def __len__(self):
return len(self.employee)
com = Company(["bobby1","bobby2"])
print(hasattr(com, "__len__"))
class A:
pass
class B:
pass
2. #我们在某些情况之下希望判定某个对象的类型
from collections.abc import Sized
isinstance(com, Sized)
b = B()
print(isinstance(b, A))
# print(len(com))
3.
#我们需要强制某个子类必须实现某些方法
#实现了一个web框架,集成cache(redis, cache, memorychache)
#需要设计一个抽象基类, 指定子类必须实现某些方法
#如何去模拟一个抽象基类
import abc
from collections.abc import *
class CacheBase(metaclass=abc.ABCMeta):
@abc.abstractmethod
def get(self, key):
pass
@abc.abstractmethod
def set(self, key, value):
pass
# class CacheBase():
# def get(self, key):
# raise NotImplementedError
# def set(self, key, value):
# raise NotImplementedError
#
class RedisCache(CacheBase):
def set(self, key, value):
pass
# redis_cache = RedisCache()
# redis_cache.set("key", "value")
Python高级:了解Python ABC(抽象基类)及 应用场景相关推荐
- python abc模块_3-2 抽象基类abc模块
abc ---- Abstract base class 何为抽象基类: 类比JAVA: 可以当作是JAVA中的接口,在JAVA里面它是无法实现多继承的,JAVA只能继承一个类,但是JAVA可以继承多 ...
- Python:抽象基类(abc模块)
抽象基类(abc模块) 介绍 白话理解 实用场景 介绍 该模块提供了一个元类 ABCMeta,可以用来定义抽象类,另外还提供一个工具类 ABC,可以用它以继承的方式定义抽象基类. 装饰器以" ...
- Python学习笔记28:从协议到抽象基类
Python学习笔记28:从协议到抽象基类 今后本系列笔记的示例代码都将存放在Github项目:https://github.com/icexmoon/python-learning-notes 在P ...
- Python ABC(抽象基类)
轉自:https://blog.csdn.net/qijiqiguai/article/details/77269839 ABC(Abstract Base Class抽象基类)主要定义了不需要具体实 ...
- python之抽象基类
抽象基类特点 1.不能够实例化 2.在这个基础的类中设定一些抽象的方法,所有继承这个抽象基类的类必须覆盖这个抽象基类里面的方法 思考 既然python中有鸭子类型,为什么还要使用抽象基类? 一是我们在 ...
- python抽象基类的作用_Python:多态、鸭子模型和抽象基类
1. 多态 什么是多态 -- 多态,指的是一种事务具有多种形态: -- python是一种动态语言,默认支持多态,同一个方法 调用 不同的类对象 ,执行的 结果各不相同: 多态实现 -- 继承:不同子 ...
- python虚函数_Python进阶话题杂谈(十三)纯虚函数与抽象基类
纯虚函数与抽象类都是Python面向对象中重要的编程范式,用于对继承类做强制性接口实现约定. abc模块包含了一系列与抽象基类与纯虚函数相关的方法.Python中通过修改元类进行抽象基类的设定.这里P ...
- python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...
主要内容 首先,本章说明抽象基类的常见用途:实现接口时作为超类使用 说明抽象基类如何检查具体子类是否符合接口定义,以及如何使 用注册机制声明一个类实现了某个接口,而不进行子类化操作 最后, 说明如何让 ...
- python 基类是什么_python之抽象基类
python之抽象基类 抽象基类,在这个类中定义一些方法,所有继承这个类的类必须实现这个方法,并且这个类不能被实例化, 使用抽象基类的情况: 1.某些情况下希望判断某个对象的类型 2.强制子类必须实现 ...
最新文章
- 网站SEO更新时选择适当的时间点有什么好处?
- linux命令行ps1变量_Linux下SHELL的PS1变量简介
- python 将图片旋转多个角度_【技术】把你的朋友变成表情包?Python:So easy
- Python面向对象学习 1 (什么是面向对象,面向对象的应用场景,待更新)
- MySQL Innodb存储引擎使用B+树做索引的优点
- dz论坛服务器技术支持,服务器更换 升级 dz论坛首页 dz其他页面打开为空白解决方法...
- apache2.4 php5.6.30,php5.6.3 + apache2.4.25 安装配置
- c++ gzip java.util.zip.gzip_java.util.zip.GZIPInputStream.close()方法示例
- 读论文看到的好的英文词句表达
- VBA之正则表达式(30)-- 提取机构代码
- 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构
- 从linaro下载安装二进制文件安装交叉编译工具
- linkinfo() 函数
- 网页设计图片向上浮动_网页设计与制作(网页设计、制作与美化)
- 武大三行情书第一名---《螃蟹在剥我的壳》
- redis keys命令,生产环境慎用,最好屏蔽掉
- 最大值最小值计算机一级,Excel2019中突出数据最大值和最小值的方法详解
- 怎么样在家拍出好看的证件照?标准证件照拍摄技巧分享
- Windows10重装设置(个人)
- 【图像几何】基于傅里叶+DCT图像变换matlab代码