Обычно точка в 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
Если такое поведение ограничено областью интересов, Что-то не так с таким шаблоном проектирования?