gpt4 book ai didi

python - 是否可以在 Python 中模拟 Scala 的特性?

转载 作者:太空狗 更新时间:2023-10-29 22:16:54 25 4
gpt4 key购买 nike

我想使用可以插入到类中的方法创建轻量级接口(interface)。这是 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有一个抽象方法transform,仍然需要在具体类中实现。

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

如果你顽固地拒绝实际给类命名,你可以直接调用type。替换

class DBwithTransformation(Transformation, DB):
pass

db = DBwithTransformation(arg1, arg2, ...)

db = type("DB", (Transformation, DB), {})(arg1, arg2, ...)

这并不比 Scala 示例差太多。

由于 python 类型系统的微妙之处,不从主类 (DB) 继承的混入首先出现在基列表中。不这样做会阻止混合类正确覆盖主基类的方法。

同样的微妙之处可以让您将额外的特性作为适当的派生类。菱形继承模式不是问题;基类只出现一次,无论有多少中间基类继承自它们(毕竟它们最终都是继承自object)。

关于python - 是否可以在 Python 中模拟 Scala 的特性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6240118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com