Python高级主题:Python ABC(抽象基类)
#抽象类实例 作用统一规范接口,降低使用复杂度。
import abc
class Animal(metaclass = abc.ABCMeta): ##只能被继承,不能实例化,实例化会报错
@abc.abstractmethod ##加完这个方法子类必须有这个方法,否则报错
def run(self):
pass
@abc.abstractmethod
def eat(self):
pass class People(Animal):
def run(self):
print("People is walking") def eat(self):
print("people is eating") class Pig(Animal):
def run(self):
print("Pig is running") def eat(self):
print("people is eating") class Dog(Animal):
def run(self):
print("Dog is zouing") def eat(self):
print("dog is eating") peo1 = People()
pig1 = Pig()
dog1 = Dog() peo1.run()
peo1.eat()
|
通用做法。
@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
|
Python高级主题:Python ABC(抽象基类)的更多相关文章
- Python抽象基类:ABC谢谢你,因为有你,温暖了四季!
Python抽象基类:ABC谢谢你,因为有你,温暖了四季! Python抽象基类:ABC谢谢你,因为有你,温暖了四季! 实例方法.类方法和静态方法 抽象类 具名元组 参考资料 最近阅读了<Pyt ...
- python面对对象编程---------6:抽象基类
抽象基本类的几大特点: 1:要定义但是并不完整的实现所有方法 2:基本的意思是作为父类 3:父类需要明确表示出那些方法的特征,这样在写子类时更加简单明白 用抽象基本类的地方: 1:用作父类 2:用作检 ...
- 流畅python学习笔记:第十一章:抽象基类
__getitem__实现可迭代对象.要将一个对象变成一个可迭代的对象,通常都要实现__iter__.但是如果没有__iter__的话,实现了__getitem__也可以实现迭代.我们还是用第一章扑克 ...
- Python 接口:从协议到抽象基类
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica } 抽象基类的常见用途:实现接口时作为超类使用.然后,说明抽象基类如何检查 ...
- guxh的python笔记七:抽象基类
1,鸭子类型和白鹅类型 1.1,白鹅类型 白鹅类型对接口有明确定义,比如不可变序列(Sequence),需要实现__contains__,__iter__,__len__,__getitem__,__ ...
- python之抽象基类
抽象基类特点 1.不能够实例化 2.在这个基础的类中设定一些抽象的方法,所有继承这个抽象基类的类必须覆盖这个抽象基类里面的方法 思考 既然python中有鸭子类型,为什么还要使用抽象基类? 一是我们在 ...
- Python中的对象行为与特殊方法(二)类型检查与抽象基类
类型检查 创建类的实例时,该实例的类型为类本身: class Foo(object): pass f = Foo() 要测试实例是否属于某个类,可以使用type()内置函数: >>> ...
- 【Python】【元编程】【从协议到抽象基类】
"""class Vector2d: typecode = 'd' def __init__(self,x,y): self.__x = float(x) self.__ ...
- python(七):元类与抽象基类
一.实例创建 在创建实例时,调用__new__方法和__init__方法,这两个方法在没有定义时,是自动调用了object来实现的.python3默认创建的类是继承了object. class A(o ...
随机推荐
- java网络访问指定出口ip
java网络访问指定出口ip Table of Contents 1. socket 2. apache httpclient 1 socket 可以在Socket构造函数中指定使用的本地ip,如: ...
- AngularJS(十):依赖注入
本文也同步发表在我的公众号“我的天空” 依赖注入 依赖注入不是AngularJS独有的概念,而是现代软件开发与架构的范畴,但是在AngularJS中“依赖注入”是其核心思想之一,所以我们专门来学习一下 ...
- Today is the first day of the rest of your life.
Today is the first day of the rest of your life. 今天是你余下人生的第一天.
- 无法定位程序输入点到_ftol2于动态链接库msvcrt.dll的错误的解决
作者:朱金灿 来源:http://blog.csdn.net/clever101 今天同事在Windows XP系统上运行程序遇到这样一个错误: 我试了一下,在Win7上运行则没有这个错误.只是程序运 ...
- newsyslog.conf详解
newsyslog.conf 指出了哪个日志文件要被管理,要保留多少和它们什么时候被创建.日志文件可以在它们达到一定大小或者在特定的日期被重新整理.# configuration file for n ...
- html5标准
1.<!DOCTYPE html> html5标准网页声明,原先的是一串很长的字符串,现在是这个简洁形式,支持html5标准的主流浏览器都认识这个声明.表示网页采用html5 浅谈:htm ...
- POJ-1459 Power Network---最大流
题目链接: https://cn.vjudge.net/problem/POJ-1459 题目大意: 简单的说下题意(按输入输出来讲,前面的描述一堆的rubbish,还用来误导人),给你n个点,其中有 ...
- 【HHHOJ】NOIP2018 模拟赛(二十四) 解题报告
点此进入比赛 得分: \(100+60+100\)(挺好的,涨了一波\(Rating\)) 排名: \(Rank\ 1\) \(Rating\):\(+115\) \(T1\):[HHHOJ13]金( ...
- 如何更改VirtualBox虚拟电脑内存大小
- Bootstrap历练实例:响应式导航(带有表单)
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...