Das ist im Wesentlichen, was Sie tun müssen, wenn sich die Aktionen für ein String-Argument stark von den Aktionen für ein Integer-Argument unterscheiden. Wenn jedoch ein Fall auf den anderen Fall reduziert wird, können Sie eine Klassenmethode als alternativen Konstruktor definieren. Als einfaches Beispiel betrachtet
class A():
def __init__(self, x):
if isinstance(x, str):
self.x = int(x)
elif isinstance(x, int):
self.x = x
else:
raise ValueError("Cannot turn %s into an int" % (x,))
Hier ist der ganze Zahl Fall die „fundamental“ Art und Weise ist eine Instanz von A
zu schaffen; Der String-Fall wird reduziert, indem die Zeichenfolge in eine Ganzzahl umgewandelt wird, und dann wird wie im Fall der Ganzzahl verfahren. Sie könnten dies umschreiben als
class A():
# x is expected to be an integer
def __init__(self, x):
self.x = x
# x is expected to be a string
@classmethod
def from_string(cls, x):
try:
return cls(int(x))
except ValueError:
# This doesn't really do anything except reword the exception; just an example
raise ValueError("Cannot turn %s into an int" % (x,))
In der Regel wollen Sie für den Typ eines Wertes zu vermeiden, überprüft, weil Typen weniger wichtig sind als Verhalten. Zum Beispiel erwartet from_string
oben nicht wirklich eine Zeichenfolge; es erwartet nur etwas, das in eine int
umgewandelt werden kann. Das könnte ein str
oder ein float
sein.