Dies kann getan werden, obwohl es möglicherweise nicht der beste Weg ist, es zu tun. Wenn schließlich die Klasse Matrix
instanziiert wird, erwartet man, dass das Ergebnis eine Matrix
Instanz ist.
Eine Möglichkeit, dies zu erreichen ist es, den Konstruktor der Matrix
Klasse anpassen:
class Matrix:
def __new__(cls, nrows, ncols):
if nrows == 1:
inst = super(Matrix, cls).__new__(Vector)
else:
inst = super(Matrix, cls).__new__(cls)
inst.nrows = nrows
inst.ncols = ncols
return inst
def __repr__(self):
return '{}(nrows={}, ncols={})'.format(
self.__class__.__name__, self.nrows, self.ncols)
Demo:
>>> m1 = Matrix(2, 5)
Matrix(nrows=2, ncols=5)
>>> Matrix(1, 5)
Vector(nrows=1, ncols=5)
Geist, die Instanzen innerhalb der __new__()
Methode tatsächlich erstellt werden, während __init__()
verwendet wird zum Initialisieren der neu erstellten Instanz.
Auch, wie in einem Kommentar unterhalb von @Blckknght erwähnt, eine Vector
Instanz durch die Matrix-Klasse zu schaffen, um unerwünschte Überraschungen führen kann, wie wie die Vector
‚s __init__()
Methoden nicht aufgerufen zu werden (es wäre manuell aufgerufen werden) .
Je nach Anwendungsfall, aber es könnte also besser sein, die Dinge sauber zu halten und nur eine Fabrik zum Beispiel Erstellung verwenden:
class Matrix:
def __init__(self, nrows, ncols):
self.nrows = nrows
self.ncols = ncols
def __repr__(self):
return '{}(nrows={}, ncols={})'.format(
self.__class__.__name__, self.nrows, self.ncols)
class Vector(Matrix):
pass
def make_matrix(nrows, ncols):
if nrows == 1:
return Vector(nrows, ncols)
return Matrix(nrows, ncols)
Demo:
>>> make_matrix(1, 5)
Vector(nrows=1, ncols=5)
>>> make_matrix(2, 5)
Matrix(nrows=2, ncols=5)
Natürlich make_matrix()
könnte auch als eine (Klasse/statische) Methode der Matrix
Klasse implementiert werden, aber das würde die Elternklasse enger mit einer seiner Kindklassen gekoppelt ...
Verwenden Sie eine Factory, die auf der Grundlage Ihrer Kriterien entscheidet, anstatt mit "__init__" etwas zu tun. –