Person.name
ist eine Instanz von einigen Geben Sie eine benutzerdefinierte __eq__
Methode ein. Während __eq__
normalerweise einen booleschen Wert (ish) zurückgibt, kann es tatsächlich zurückgeben, was auch immer Sie wollen, einschließlich eines Lambda. Weitere Informationen zu dieser und verwandten Methoden finden Sie unter Python special method names.
Der wohl verwirrend/irreführende Teil davon (vor allem, wenn Sie zu anderen OO-Sprachen wie Java gewohnt sind), ist, dass Person.name
und person.name
(wo person
ist eine Instanz Person
) keine Beziehung haben müssen zu gegenseitig. Zum Beispiel:
class Person(object):
name = "name of class"
def __init__(self):
self.name = "name of instance"
person = Person()
print Person.name
print person.name
Dies drucken:
name of class
name of instance
Beachten Sie, dass die Klasse Eigenschaft nur in der Klasse Körper festgelegt ist, während die Instanz Eigenschaft im __init__
Verfahren eingestellt wird.Dies ist sicherlich
True
False
:
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)
Diese Drucke
: liefert
In Ihrem Fall würden Sie Person.name
auf das Objekt mit den benutzerdefinierten __eq__
Verfahren, das auch ein Lambda, so etwas wie diese "Ich bin zu schlau", deshalb wäre ich sehr vorsichtig, wenn es darum geht, dies im Produktionscode zu verwenden. Ein explizites Lambda würde zukünftigen Betreuern wahrscheinlich viel klarer sein, auch wenn es ein wenig ausführlicher ist.
Java und Operator überladen ... glaube nicht, dass es jemals wahr werden wird. Auf der anderen Seite hast du vielleicht recht. – Geo
Ungerade .... Akzeptieren einer "raten" Antwort, wenn eine andere Antwort auf dem tatsächlichen Quellcode in Storm basiert. –
Entschuldigung, aber meine Vermutung war "schnell genug" :-) PS du hast recht, es ist sehr merkwürdig! – dfa