模仿Python(纯)虚拟函数,如C#
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了模仿Python(纯)虚拟函数,如C#,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2872字,纯文字阅读大概需要5分钟。
内容图文
![模仿Python(纯)虚拟函数,如C#](/upload/InfoBanner/zyjiaocheng/824/fdca60480d0d4c5086b27286ce435799.jpg)
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#全部内容,希望文章能够帮你解决模仿Python(纯)虚拟函数,如C#所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。