Sto sottoclassi un tipo definito in un modulo C per alias alcuni attributi e metodi in modo che il mio script funzioni in diversi contesti.Metodo ignorato quando sottoclasse un tipo definito in un modulo C
Come è possibile che per farlo funzionare, devo modificare manualmente il dizionario della mia classe? Se non aggiungo un riferimento a DistanceTo
nel dizionario, ottengo Point3d has no attribute named DistanceTo
.
class Point3d(App.Base.Vector):
def __new__(cls, x, y, z):
obj = super(Point3d, cls).__new__(cls)
obj.x, obj.y, obj.z = x, y, z
obj.__dict__.update({
'X':property(lambda self: self.x),
'Y':property(lambda self: self.y),
'Z':property(lambda self: self.z),
'DistanceTo':lambda self, p: self.distanceToPoint(p)})
return obj
def DistanceTo(self, p): return self.distanceToPoint(p)
pensavo che una volta __new__
erano tornati un'istanza ho potuto ancora compilarlo con i metodi e gli attributi. Qualcuno può far luce su questo?
MODIFICA: il modulo che importa da è FreeCAD. Il tipo di base C è definito there. Poi Vector deriva forma questa definizione here
EDIT2: Ho provato anche il seguente:
class Point3d(App.Base.Vector):
def __new__(cls, x, y, z):
obj = super(Point3d, cls).__new__(cls)
obj.x, obj.y, obj.z = x, y, z
obj.__dict__.update({
'X': x, 'Y': y, 'Z': z,
'DistanceTo':lambda self, p: self.distanceToPoint(p)})
return obj
def DistanceTo(self, p): return self.distanceToPoint(p)
e dopo aver creato un secondo punto, sia Point3D p
restituisce il valore dell'ultimo punto per p.X
, p.Y
e p.Z
non importa quali siano stati passati i parametri x,y,z
durante la creazione dell'istanza. p.x, p.y, p.z
restituiscono i valori previsti. Sembra indicare che il dizionario è condiviso tra le istanze.
EDIT 3: problema risolto! Il bit Py_TPFLAGS_BASETYPE è impostato su zero per impedire la sottoclasse come spiegato nella risposta seguente.
Penso che questa sia una risposta valida ma ti consiglierei di porre domande di follow-up in una nuova domanda invece di qui. – MSeifert
Scusate, aprirò una nuova domanda dopo aver fatto un po 'di ricerche. –