python虚函数_模仿Python(纯)虚拟函数,如C#

Python中模拟虚拟和纯虚函数(如C#中)的最佳方法是什么?

目前我使用的架构如下:

class AbstractClass(object):

'''Abstract class'''

def __init__(self):

assert False, 'Class cannot be instantiated'

def _virtual_init(self):

print 'Base "constructor"'

def pure_virtual_function(self):

assert False, 'Pure virtual function should be derived'

def virtual_function(self):

print 'Base: virtual function'

class Derived1(AbstractClass):

'''All functions derived'''

def __init__(self):

print 'Derived1: constructor'

AbstractClass._virtual_init(self)

def pure_virtual_function(self):

print 'Derived1: pure virtual function'

def virtual_function(self):

print 'Derived1: virtual function'

class Derived2(AbstractClass):

'''Pure virtual method missing.'''

def __init__(self):

print 'Derived2: constructor'

AbstractClass._virtual_init(self)

def virtual_function(self):

print 'Derived3: virtual function'

class Derived3(AbstractClass):

'''Virtual method missing (use base class)'''

def __init__(self):

print 'Derived3: constructor'

AbstractClass._virtual_init(self)

def pure_virtual_function(self):

print 'Derived3: pure virtual function'

# ab = AbstractClass() # Gives error -> OK

print 'DERIVED 1'

dv1 = Derived1()

dv1.pure_virtual_function()

dv1.virtual_function()

print 'DERIVED 2'

dv2 = Derived2()

# dv2.pure_virtual_function() # Gives error: Pure virtual function should be derived -> OK

dv2.virtual_function()

print 'DERIVED 3'

dv3 = Derived3()

# dv3.pure_virtual_function() # Gives error: Pure virtual function should be derived -> OK

dv3.virtual_function()

我得到输出:

DERIVED 1

Derived1: constructor

Base "constructor"

Derived1: pure virtual function

Derived1: virtual function

DERIVED 2

Derived2: constructor

Base "constructor"

Derived3: virtual function

DERIVED 3

Derived3: constructor

Base "constructor"

Derived3: pure virtual function

Base: virtual function

但是我的具体问题是:

>在Python(2.7)中定义抽象基类是否有更优雅的方法?

上述解决方案仅在运行时给出错误(例如,不用pylint)

Python afaik中没有’abstract’关键字.

>在Python(2.7)中有更优雅的方法来定义纯虚方法吗?

同样,上述解决方案仅在运行时给出错误.

>在Python(2.7)中有更优雅的方法来定义虚拟方法吗?

不需要检查,但在Python afaik中没有像’virtual’这样的关键字.

提前致谢.

解决方法:

当你询问虚拟方法时,我不确定你究竟是什么意思,因为在Python中,所有方法都是虚拟的.而且我也不确定你为什么使用_virtual_init而不是__init__ …只是重命名一个方法给你买东西?

更新:啊,我有个主意.您可能这样做是为了禁止基类的实例化,同时保持其中的初始化功能.这里的答案是:强迫事物不是pythonic.只记录这个类是抽象的(可能称之为AbstractSmth).

说到运行时错误. Python是一种动态语言,所以它就是这样的.一个常见的习惯用法是在__init__中引发NotImplementedError以显示您的类是抽象的(对于抽象(纯虚拟)方法也是如此).您还可以查看abc,因为它可以执行您想要的操作:它禁止实例化抽象类.但我也强烈建议阅读PEP-3119以了解抽象基类是什么以及它们不是什么.

AFAIK,提出NotImplementedError足以让pylint理解你的类/方法是抽象的.

标签:python,c,virtual-functions,pure-virtual,abstract-class

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值