Python: Erstellen einer Klasseninstanz ohne Aufruf des Initialisierers
Gibt es eine Möglichkeit, zu vermeiden, fordern __init__
auf eine Klasse während der Initialisierung ist es, wie aus einer Methode der Klasse?
Ich versuche ein Gehäuse zu konstruieren und Satzzeichen, Kleinschreibung string-Klasse in Python zur effizienten Vergleich Zwecke, aber ich habe Probleme bei der Erstellung einer neuen Instanz ohne Aufruf __init__
.
>>> class String:
def __init__(self, string):
self.__string = tuple(string.split())
self.__simple = tuple(self.__simple())
def __simple(self):
letter = lambda s: ''.join(filter(lambda s: 'a' <= s <= 'z', s))
return filter(bool, map(letter, map(str.lower, self.__string)))
def __eq__(self, other):
assert isinstance(other, String)
return self.__simple == other.__simple
def __getitem__(self, key):
assert isinstance(key, slice)
string = String()
string.__string = self.__string[key]
string.__simple = self.__simple[key]
return string
def __iter__(self):
return iter(self.__string)
>>> String('Hello, world!')[1:]
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
String('Hello, world!')[1:]
File "<pyshell#1>", line 17, in __getitem__
string = String()
TypeError: __init__() takes exactly 2 positional arguments (1 given)
>>>
Was sollte ich ersetzen string = String(); string.__string = self.__string[key]; string.__simple = self.__simple[key]
mit initialisiert das neue Objekt mit den Scheiben?
EDIT:
Als inspiriert durch die Antwort unten geschrieben, die Initialisierung der bearbeitet wurde, um schnell zu überprüfen, für die keine Argumente.
def __init__(self, string=None):
if string is None:
self.__string = self.__simple = ()
else:
self.__string = tuple(string.split())
self.__simple = tuple(self.__simple())
InformationsquelleAutor der Frage Noctis Skytower | 2010-01-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn möglich, lassen
__init__
aufgerufen (und tätigen Sie den Anruf ganz harmlos durch die passenden Argumente) vorzuziehen ist. Allerdings sollte das zu viel verlangt von einer Verdrehung, haben Sie eine alternative, so lange wie Sie vermeiden, die katastrophale Wahl, old-style-Klassen, (es gibt keine guten Grund für die Verwendung von old-style-Klassen in den neuen code, und mehrere gute Gründe nicht)...:Dieses idiom ist allgemein in
classmethod
s, die gemeint sind, um Arbeit als "alternative Konstruktoren", so werden Sie in der Regel finden Sie es in einer Weise, wie...:(auf diese Weise die classmethod werden richtig vererbt werden und erzeugen Unterklasse-Instanzen aufgerufen, wenn auf eine Unterklasse, anstatt sich auf die Basis-Klasse).
InformationsquelleAutor der Antwort Alex Martelli
Einen trick, die standard Gurke und kopieren Sie Module verwenden, ist eine leere Klasse erstellen, instanziieren Sie das Objekt verwenden, und weisen Sie dann diese Instanz ist
__class__
zu den "echten" Klasse. z.B.Aber beachten Sie, dieser Ansatz ist sehr selten notwendig. Unter Umgehung der
__init__
kann einige unerwartete Nebenwirkungen, besonders wenn Sie nicht vertraut mit der ursprünglichen Klasse, so stellen Sie sicher, Sie wissen, was Sie tun.InformationsquelleAutor der Antwort Cerin
Mithilfe einer Metaklasse bietet eine schöne Lösung in diesem Beispiel. Die Metaklasse hat begrenzte Nutzung, aber funktioniert gut.
InformationsquelleAutor der Antwort Noctis Skytower
Pass ein weiteres argument für den Konstruktor, wie folgt:
Dann können Sie es so nennen:
Auch, ich bin nicht sicher, es ist möglich das der name das Feld, und die Methode
__simple
. Wenn nur zur besseren Lesbarkeit sollten Sie das ändern.InformationsquelleAutor der Antwort Thomas