【发布时间】:2018-08-25 14:34:19
【问题描述】:
通常,Python 中的句点表示类成员身份:
class A:
a = 1
>>> A.a
1
不过,有时该语言似乎不够灵活,无法完全表达计算机科学以外领域的想法。考虑以下示例(为简洁起见,相当脆弱)使用相同的运算符看起来完全不同。
class Vector:
def __init__(self, data):
self.data = list(data)
def dot(self, x):
return sum([a*b for a, b in zip(self.data, x.data)])
def __getattr__(self, x):
if x == 'Vector':
return lambda p: self.dot(Vector(p))
return self.dot(globals()[x])
在这里,我们接管了__getattr__(),因此在 Python 会尝试从我们的向量中查找属性的许多场景中,它会计算数学点积。
>>> v = Vector([1, 2])
>>> v.Vector([3, 4])
11
>>> v.v
5
如果将此类行为的范围限制在感兴趣的领域,这样的设计模式有什么问题吗?
【问题讨论】:
-
当我们有 numpy 时,为什么要在 python 中实现这个?我看不到弄乱语法的好处
-
我想很多人都会同意,将
.从其属性访问的标准含义中重新用作对 raised 点的粗略模仿会降低代码的可读性.有些人认为使用+进行数字加法和列表连接是错误的;这是一个更加不同的重载。 -
在 Stack Overflow 问题中与人争论语言设计有点奇怪。并非每个字符都很重要,如果您重复使用特定功能,我的评估是您可能遇到了一个架构问题,您没有编写可重用的库。
-
@roganjosh Numpy 是一个重量级的依赖,如果你愿意,你可以做同样的事情来修改 numpy 的行为。另外,这是一个玩具示例。我有一个示例,其中包含树和图表的语法,事后看来可能没有受到如此负面的评价。
标签: python design-patterns syntax