python如何定义抽象类_定义抽象类的三种方法的区别

我发现了在Python中定义抽象类的多种方法(稍有不同)。我阅读了文档,在stackoverflow上也找不到答案。在

这三个示例(见下面的代码)之间的主要区别是:A显式地设置一个新的元类abc.ABCMeta

B继承自abc.ABC

C继承自objects,但定义了@abc.abstractmethod类

似乎A和{}没有区别(也就是说,B也有新的元类{})。但是,类C仍然是type类型。在

不为C定义元类有什么影响?什么时候有必要定义元类,或者不为抽象类定义abc.ABCMeta元类是错误/错误的风格?尽管如此,类C的行为似乎与我从ABC中所期望的一样。在import abc

class A(metaclass=abc.ABCMeta):

# Alternatively put __metaclass__ = abc.ABCMeta here

@abc.abstractmethod

def foo(self):

raise NotImplementedError

class B(abc.ABC):

@abc.abstractmethod

def foo(self):

raise NotImplementedError

class C(object):

@abc.abstractmethod

def foo(self):

raise NotImplementedError

class Aimpl(A):

def foo(self):

print("Aimpl")

class Bimpl(B):

def foo(self):

print("Bimpl")

class Cimpl(C):

#def foo(self):

# print("Cimpl")

pass

Aimpl().foo() # Aimpl

print(isinstance(Aimpl, A)) # False

print(issubclass(Aimpl, A)) # True

print(isinstance(Aimpl, abc.ABCMeta)) # True

print(type(A)) #

print("---")

Bimpl().foo() # Bimpl

print(isinstance(Bimpl, B)) # False

print(issubclass(Bimpl, B)) # True

print(isinstance(Bimpl, abc.ABCMeta)) # True

print(type(B)) #

print("---")

Cimpl().foo() # Cimpl

print(isinstance(Cimpl, C)) # False

print(issubclass(Cimpl, C)) # True

print(isinstance(Cimpl, abc.ABCMeta)) # False

print(type(C)) #

print("---")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值