是否可以在Python中模拟Scala的特征?
发布时间:2021-01-17 02:46:59 所属栏目:Python 来源:互联网
导读:我想用我可以插入类的方法创建轻量级接口.这是 Scala中的一个简短示例: class DB { def find(id: String) = ...}trait Transformation extends DB { def transform(obj: String): String override def find(id: String) = transform
|
我想用我可以插入类的方法创建轻量级接口.这是 Scala中的一个简短示例: class DB {
def find(id: String) = ...
}
trait Transformation extends DB {
def transform(obj: String): String
override def find(id: String) =
transform(super.find(id))
}
trait Cache extends DB {
val cache = Cache()
override def find(id: String) = {
...
if (cache.contains(id))
cache.find(id)
else {
cache.set(id,super.find(id))
cache.get(id)
}
}
}
使用这些类(特征),我们可以使用Transformation,使用Cache或两者来实例化DB类.请注意,Transformation有一个抽象方法转换,仍然需要在具体类中实现. new DB() with Transformation {
def transform(obj: String): obj.toLower()
}
new DB() with Cache
new DB() with Transformation with Cache {
def transform(obj: String): obj.toLower()
}
有没有办法在Python中实现这样的东西?我知道Python有一个Traits包,但它的目的似乎不同. 解决方法最简单的解决方案可能就是创建另一个子类.# assuming sensible bases:
class DB(object):
...
class Transformation(object):
def transform(self,obj):
...
def get(self,id):
return self.transform(super(Transformation,self).get(id))
class Cache(object):
def __init__(self,*args,**kwargs):
self.cache = Cache()
super(Cache,self).__init__(*args,**kwargs)
def get(self,id):
if id in self.cache:
return self.cache.get(id)
else:
self.cache.set(id,super(Cache,self).get(id))
return self.cache.get(id)
class DBwithTransformation(Transformation,DB):
# empty body
pass
如果你固执地拒绝实际给这个班级命名,你可以直接打电话给你.更换 class DBwithTransformation(Transformation,DB):
pass
db = DBwithTransformation(arg1,arg2,...)
同 db = type("DB",(Transformation,DB),{})(arg1,...)
这并不比Scala示例差太多. 由于python类型系统的微妙之处,不从主类(DB)继承的mixin首先出现在基本列表中.不这样做会阻止mixin类正确地覆盖主基类的方法. 同样的微妙之处可以让你有额外的功能是适当的派生类.钻石继承模式不是问题;基类只出现一次,无论有多少中间基类从它们继承(毕竟,它们都最终从对象继承). (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- python – 我可以在没有循环的情况下清理一个numpy数组吗?
- python – vectorize numpy独特的子阵列
- python – 读取另一个进程的命令行参数(Win32 C代码)
- python – 如何以有效的方式找到两个轮廓集之间的所有交点
- 从python执行Shell脚本与变量
- 【Python】python中p-value的实现
- 想在Jupyter Notebook(Anaconda)中保存并运行Python脚本
- 默认情况下,如何配置mercurial hg不保留备份?
- python – SQLAlchemy:排除从查询中的子查询中获取的行
- python逻辑运算(not,and,or)总结
