如何在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中没有'abstract'关键字。
- 在Python(2.7)中是否有更优雅的方法来定义纯虚方法? 同样,上述解决方案只会在运行时出现错误。
- 在Python(2.7)中是否有更优雅的方法来定义虚方法? 不需要检查,但Python中没有'virtual'关键字。
abc
模块。你可能需要去看一下那里,看看它是否提供了你所需要的功能。 - mgilson