Wenn Sie Veränderlichkeit nicht brauchen, ist die einfachste Art und Weise grundlegende Klassen dieser Art zu machen, ist collections.namedtuple
:
import collections
Point = collections.namedtuple('Point', 'x y')
Das ist es. Sie können einfach Point
Objekte mit pt = Point(1, 2)
oder ähnlichem machen, und sie funktionieren wie Zwei-Tupel, aber sie lassen Sie auch über benannte Attribute, z. pt.x
, .
wird die Gleichheit Prüfung etwas lockerer sein (Point(1, 2) == (1, 2)
zu True
wertet, weil alle namedtuple
s Subklassen von tuple
und wird mit tuple
Regeln, und in der Tat verschiedene Unterklassen von tuple
außer Kraft nicht die Vergleichsmethoden vergleichen Vergleichen Sie einander gleich, wenn sie die gleichen Werte haben), aber vorausgesetzt, dass tuple
s in der Regel als anonyme leichte "Klassen" verwendet werden, ist dies oft, was Sie wollen.
Wenn Sie ein Verhalten anpassen müssen (Hinzufügen von Funktionen oder strengere Typenvergleiche), können Sie eine benutzerdefinierte Klasse von einer namedtuple
erben, um die grundlegenden Funktionen kostenlos zu erhalten, und dann die Bits anpassen, die Ihnen wichtig sind, z , zu verhindern, dass es gleich testen Point
Typen an nicht, können Sie tun:
class Point(collections.namedtuple('PointBase', 'x y')):
def __eq__(self, other):
if not isinstance(other, Point):
return False
return super().__eq__(other)
# Sadly, tuple defines __ne__, so you must override it too to behave properly
# You don't need the canonical __ne__ implementation that handles NotImplemented
# though, since you're explicitly unfriendly to non-Point types
def __ne__(self, other): return not (self == other)
nitpick, benötigen Sie einen '#: transparent' auf' struct' Definition in '#lang racket' tiefe Gleichheit zu bekommen, aber das ändert nicht die Anzahl der Zeilen, die es braucht. –
@ JohnClements, Sie können einfach __eq__ und __lt__ definieren und Ihre Objekte werden mit '>,> =,
lmiguelvargasf
Beachten Sie, dass Ihr Python-Code Platz für viele benutzerdefinierte Verhaltensweisen bietet, von denen nicht alle für jede Klasse erforderlich sind. Außerdem mussten Sie nur zehn Zeilen schreiben. – TigerhawkT3