Person.name
является экземпляром некоторого типа с пользовательским методом __eq__
. В то время как __eq__
обычно возвращает значение boolean (ish), оно может фактически вернуть все, что вы хотите, включая лямбда. См. Python special method names для получения дополнительных сведений об этом и связанных с ним методах.
Вероятно, наиболее запутанным/вводящие в заблуждение часть этого (особенно если вы привыкли к другим языкам OO, как Java) является то, что Person.name
и person.name
(где person
является экземпляром Person
) не должны иметь никакого отношения к друг друга. Например:
class Person(object):
name = "name of class"
def __init__(self):
self.name = "name of instance"
person = Person()
print Person.name
print person.name
Это будет печатать:
name of class
name of instance
Обратите внимание, что свойство класса просто устанавливается в теле класса, в то время как свойство экземпляра устанавливается в методе __init__
.
В вашем случае, вы бы установить Person.name
на объект с пользовательской __eq__
метод, который возвращает лямбда, что-то вроде этого:
class LambdaThingy(object):
def __init__(self, attrname):
self.__attrname = attrname
def __eq__(self, other):
return lambda x: getattr(x, self.__attrname) == other
class Person(object):
name = LambdaThingy('name')
def __init__(self, name):
self.name = name
equals_fred = Person.name == "Fred"
equals_barney = Person.name == "Barney"
fred = Person("Fred")
print equals_fred(fred)
print equals_barney(fred)
Это печатает:
True
False
Это, конечно, обойдя край «слишком умного», поэтому я бы очень осторожно относился к этому в производственном коде. Явная лямбда, вероятно, будет намного яснее будущим сопровождающим, даже если это немного более многословно.
Перегрузка Java и оператора ... не думайте, что это когда-либо произойдет. С другой стороны, может быть, вы правы. – Geo
Нечетный .... Принимая ответ «угадывания», когда другой ответ основан на фактическом исходном коде в Storm. –
извините, но моя догадка была «достаточно быстрой» :-) PS, вы правы, это очень странно! – dfa