Person.name
- это экземпляр некоторого типа с пользовательским методом __eq__
. Хотя __eq__
обычно возвращает логическое значение (ish), на самом деле оно может возвращать все, что вы хотите, включая лямбду. См. Имена специальных методов Python для получения дополнительной информации об этом и связанных методах.
Вероятно, наиболее запутывающей / вводящей в заблуждение частью этого (особенно если вы привыкли к другим языкам OO, например, Java) является то, что Person.name
и person.name
(где person
является экземпляром Person
) don ' не должно иметь никакого отношения друг к другу. Например:
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
Это, конечно, обход "слишком умного" края, поэтому я буду очень осторожен при использовании этого в производственном коде. Явная лямбда, вероятно, будет намного понятнее будущим сопровождающим, даже если она будет более многословной.