2016-07-12 14 views
0

Ich versuche eine Klasse zu implementieren, die von int geerbt wurde und einige Member hinzufügt, aber ich finde die Instanz von der abgeleiteten Klasse kann nicht korrekt kopiert werden (sogar tiefe Kopie), wenn sich die Reihenfolge der Argumente ändert, siehe Beispiel unten, versuchen, eine positive int-Klasse erstellen:Python-Vererbung von unveränderbarer Klasse int, warum die Reihenfolge der Argumente beim Kopieren wichtig ist?

# Example 1 
import copy as cp 
class PositiveInt(int): 
def __new__(cls, arg = 1, arg0 = 2, arg1 = 3): 
    if arg < 0: 
     arg = -arg 
    return super(PositiveInt, cls).__new__(cls, arg) 
def __init__(self, arg = 1, arg0 = 2, arg1 = 3): 
    self.arg0 = arg0 
    self.arg1 = arg1 

n = PositiveInt(3, 4, 5) 
m = cp.copy(n) 
print(n, n.arg0, n.arg1) 
print(m, m.arg0, m.arg1) 

Dies drucken:
(3, 4, 5)
(3, 4, 5)

# Example 2 
class PositiveInt(int): 
def __new__(cls, arg0 = 2, arg = 1, arg1 = 3): 
    if arg < 0: 
     arg = -arg 
    return super(PositiveInt, cls).__new__(cls, arg) 
def __init__(self, arg0 = 2, arg = 1, arg1 = 3): 
    self.arg0 = arg0 
    self.arg1 = arg1 

n = PositiveInt(4, 3, 5) 
m = cp.copy(n) 
print(n, n.arg0, n.arg1) 
print(m, m.arg0, m.arg1) 

Dies drucken:
(3, 4, 5)
(1, 4, 5)

Der einzige Unterschied ist die Reihenfolge der Argumente. Es scheint in Beispiel 2, verwenden kopieren Sie den Standardwert von arg für Instanziierung in neuen, aber dies ist nicht der Fall in Beispiel 1.

Antwort

0

m = cp.copy(n)m = PositiveInt(n) die m=PositiveInt(3)

ruft wiederum Aufruf endet Sie könnten __copy__

def __copy__(self): 
    return PositiveInt(self.arg0,self,self.arg1) 

Unterklasse oder man könnte das erste Argument in __new__ überprüfen (vielleicht ... ich nicht wirklich denke, das funktioniert) ... aber eigentlich sollte man nur __copy__ Unterklasse