Python2和Python3中@abstractmethod的用法

抽象方法:

抽象方法表示基类的一个方法,没有实现,所以基类不能实例化,子类实现了该抽象方法才能被实例化。

Python的abc提供了@abstractmethod装饰器实现抽象方法,下面以Python3的abc模块举例。

@abstractmethod:

见下图的代码,基类Foo的fun方法被@abstractmethod装饰了,所以Foo不能被实例化;子类SubA没有实现基类的fun方法也不能被实例化;子类SubB实现了基类的抽象方法fun所以能实例化。

完整代码:

在Python3.4中,声明抽象基类最简单的方式是子类话abc.ABC;Python3.0到Python3.3,必须在class语句中使用metaclass=ABCMeta;Python2中使用__metaclass__=ABCMeta

Python3.4 实现方法:

from abc import ABC, abstractmethod

class Foo(ABC):
    @abstractmethod
    def fun(self):
        ‘‘‘please Implemente in subclass‘‘‘
class SubFoo(Foo):
    def fun(self):
        print(‘fun in SubFoo‘)

a = SubFoo()
a.fun()

Python3.0到Python3.3的实现方法:

from abc import abstractmethod, ABCMeta

class Bar(metaclass=ABCMeta):
    @abstractmethod
    def fun(self):
        ‘‘‘please Implemente in subclass‘‘‘
class SubBar(Bar):
    def fun(self):
        print(‘fun in SubBar‘)

b = SubBar()
b.fun()

Python2的实现方法:

from abc import ABCMeta, abstractmethod

class FooBar():
    __metaclass__ = ABCMeta
    @abstractmethod
    def fun(self):
         ‘‘‘please Implemente in subclass‘‘‘
class SubFooBar(FooBar):
    def fun(self):
        print(‘fun in SubFooBar‘)

a = SubFooBar()
a.fun()

原文地址:https://www.cnblogs.com/qiumingcheng/p/12244896.html

时间: 2024-10-11 23:49:36

Python2和Python3中@abstractmethod的用法的相关文章

有关python2与python3中关于除的不同

有关python2与python3中关于除的不同 python中2版本与3版本关于除的处理还是有一些差异的. 在python 2.7.15中除(/)是向下取整的,即去尾法. 123/10 # 结果 12 128/10 # 结果 12 在python 3中除(/)是相对于2版本精确了一些,例如: print(123/10) # 结果 12.3 原文地址:https://www.cnblogs.com/ZN-225/p/10574748.html

python2与python3中__metacalss__的不同用法

python3 def upper_attr(future_class_name, future_class_parents, future_class_attr): attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__')) uppercase_attr = dict((name.upper(), value) for name, value in attrs

python2和python3中的编码问题

开始拾起python,准备使用python3, 造轮子的过程中遇到了编码的问题,又看了一下python3和python2相比变化的部分. 首先说个概念: unicode:在本文中表示用4byte表示的unicode编码,也是python内部使用的字符串编码方式. utf-8:在本文中指最少1byte表示的unicode编码方式 我在使用 if isinstance(key,unicode): key= key.encode('utf-8') 的时候,发现key值被转成了b'foo',b'bar'

Python2和Python3中print的不同点

在Python2和Python3中都提供print()方法来打印信息,但两个版本间的print稍微有差异 主要体现在以下几个方面: 1.python3中print是一个内置函数,有多个参数,而python2中print是一个语法结构: 2.Python2打印时可以不加括号:print 'hello world', Python3则需要加括号   print("hello world") 3.Python2中,input要求输入的字符串必须要加引号,为了避免读取非字符串类型发生的一些行为

每日一读:《关于python2和python3中的range》

官网原话是这么说的:In many ways the object returned by range() behaves as if it is a list, but in fact it isn't. It is an object which returns the successive items of the desired sequence when you iterate over it, but it doesn't really make the list, thus sav

Python2 和 Python3 中默认编码的差异

最近在使用 Python3.4 做一些脚本实现,发现对于编码的处理上和 Python2.6 有很大的不同,就此机会把相关知识做个梳理,方便需要的时候查阅. 先说下概念和差异: 脚本字符编码:就是解释器解释脚本文件时使用的编码格式,可以通过 # -\*- coding: utf-8 -\*- 显式指定解释器字符编码:解释器内部逻辑过程中对 str 类型进行处理时使用的编码格式Python2 中默认把脚步文件使用 ASCII 来处理(历史原因请 Google)Python2 中字符串除了 str 还

python2 与python3中最大的区别(编码问题bytes&str

1,在python2.x 中是不区分bytes和str类型的,在python3中bytes和str中是区分开的,str的所有操作bytes都支持 python2 中 >>> s = "abcdefg" >>> b = s.encode()    #或者使用下面的方式 >>> b = b"abcdefg">>> type(b)<type 'str'> python3中     #str

nose在python2与python3中的包的自动发现用例的区别

最近在使用python3,同样装了nose,发现自动发现用例总是有问题,如下面的代码结婚 testcase |------ __init__.py |------ test_bb.py test_bb.py中文件为: def test_qq(): pass Python3中: 再使用nose执行testcase提示: ----------------------------------------------------------------------Ran 0 tests in 0.001

python2和python3中的关键字的区别--keyword模块

一.python3.6中的: 共33个关键字: 通过导入keyword模块,查看python所有的关键字.在ipython中: Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)]Type "copyright", "credits" or "license" for more information.