我正在尝试了解使用更新python字典的确切机制d[key] += diff.我有一些辅助类来跟踪魔术方法调用:
class sdict(dict):
def __setitem__(self, *args, **kargs):
print "sdict.__setitem__"
return super(sdict, self).__setitem__(*args, **kargs)
def __delitem__(self, *args, **kargs):
print "sdict.__delitem__"
return super(sdict, self).__delitem__(*args, **kargs)
def __getitem__(self, *args, **kargs):
print "sdict.__getitem__"
return super(sdict, self).__getitem__(*args, **kargs)
def __iadd__(self, *args, **kargs):
print "sdict.__iadd__"
return super(sdict, self).__iadd__(*args, **kargs)
def __add__(self, *args, **kargs):
print "sdict.__add__"
return super(sdict, self).__add__(*args, **kargs)
class mutable(object):
def __init__(self, val=0):
self.value = val
def __iadd__(self, val):
print "mutable.__iadd__"
self.value = self.value + val
return self
def __add__(self, val): …Run Code Online (Sandbox Code Playgroud) 在这个简化的实验中,我希望能够快速构建一个具有可堆叠特征的类,该类可以报告用于构建它的特征.这让我想起了装饰器模式,但我更喜欢在编译时而不是在运行时实现它.
冗余代码的工作示例
class TraitTest {
def report(d: Int) : Unit = {
println(s"At depth $d, we've reached the end of our recursion")
}
}
trait Moo extends TraitTest {
private def sound = "Moo"
override def report(d: Int) : Unit = {
println(s"At depth $d, I make the sound '$sound'")
super.report(d+1)
}
}
trait Quack extends TraitTest {
private def sound = "Quack"
override def report(d: Int) : Unit = {
println(s"At depth $d, I make the sound '$sound'")
super.report(d+1) …Run Code Online (Sandbox Code Playgroud) 在Coursera 的"反应式编程原理"课程的第二周讲座中,有一个例子包含了这段有趣的代码:
val notIn1, notIn2, notOut = new Wire
Run Code Online (Sandbox Code Playgroud)
这里使用的语言功能是什么?
这会创建三个唯一的实例(向构造函数添加println会打印3行),因此它不会被转换为类似的东西
val notIn1 = notIn2 = notOut = new Wire
Run Code Online (Sandbox Code Playgroud)
调用的结果new Wire不会返回元组,所以我不认为它是模式匹配.有任何想法吗?