2017-02-11 5 views
0

Ich habe eine Klasse, die Methoden und einen Konstruktor in Python enthält. Der Rückgabewert des Konstruktors wird ein Objekt sein, aber ich brauche einen Rückgabewert einer Klasse (Konstruktor) wie numbers.Number Typ.Wie ändert man die Superklasse eines Objekts?

Ist es möglich, den Rückgabewert der Klasse durch Hinzufügen numbers.Number als Super-Klasse dieser Klasse zu ändern, und wenn ja, könnte jemand beschreiben, wie es geht?


class Num(Parent): 
    #Some Code 
    #Here Parent must be inherited 

class Foo(Num): 
    #Foo Should return of type numbers.Number 
    #Here Num must be inherited 

Jetzt möchte ich Foonumber.Number Wert zurückgeben, wenn wir Konstruktor Foo nennen.

+3

Ihre Fabrik Klassenzahlen nicht haben muss. Number als Basisklasse, um Objekte dieses Typs zu erstellen. Es kann nur eine Methode geben, die Objekte dieses Typs erzeugt und zurückgibt. Vielleicht vermisse ich etwas. –

+0

Konstruktoren in Python geben nichts zurück. Zu dem Zeitpunkt, an dem sie aufgerufen werden, ist eine Klasseninstanz eines Typs, der bereits existiert, erforderlich. Konstruktor muss lediglich eine weitere Initialisierung durchführen. Sie können das tun, was Sie wollen, indem Sie die Methode '__new __()' überschreiben, die den Typ des erstellten Objekts bestimmt. Alternativ benötigen Sie möglicherweise etwas, das manchmal als "virtueller Konstruktor" bezeichnet wird. Suchen Sie nach diesem Begriff. Wenn Sie in Ihrer Frage tatsächlich Code hatten, der veranschaulicht, was Sie tun möchten, könnten Sie bessere (oder zumindest konkretere) Antworten erhalten. – martineau

+0

@martineau vielleicht bist du auf dem richtigen weg, kannst du das mit gegebenem code von mir in frage stellen? – Meet

Antwort

0

Ich bin mir nicht sicher, was Sie tun dies erreichen wollen, noch, was Sie erwarten als Folge passieren. Da numbers.Number jedoch eine abc (abstrakte Basisklasse) ist, bedeutet dies, dass Sie Ihre eigene Klasse als eine ihrer Unterklassen betrachten können, indem Sie sie einfach mit der abc registrieren. (Es gibt keine Notwendigkeit, außer Kraft zu setzen __new__ wie ich dachte zuerst, weil ich nicht erkennen, dass numbers.Number war ein abc.)

Hier ist, was ich meine:

import numbers 

class Parent(object): 
    # Added only to make script runnable 
    pass 

class Num(Parent): 
    #Some Code 
    #Here Parent must be inherited 
    pass 

class Foo(Num): 
    #Foo Should return of type numbers.Number 
    #Here Num must be inherited 
    pass 

numbers.Number.register(Foo) 

foo = Foo() 
print(isinstance(foo, numbers.Number)) # -> True 
+0

'Zahlen.Anzahl.register (Foo) 'generiert einen Fehler mit der Nachricht' AttributeError: Type Objekt 'Number' hat kein Attribut 'register' ' – Meet

+0

Der Code in meiner Antwort läuft ohne Fehler für mich in Python 2.7.13 und Python 3.6.0-so ich habe keine Ahnung, was das Problem sein könnte. – martineau

0

Dies kann über den Standard erfolgen.

from numbers import Number 

class MyNumber(Number): 
    def is_number(self): 
     return isinstance(a, Number) 

a = MyNumber() 
print(a.is_number()) 

Es sollte beachtet werden, dass alle Klassen der numbers module sind Abstract Base Classes (ABCs) und nicht instanziiert werden kann. Sie ähneln Schnittstellen in anderen Sprachen (wie Java) und sind in entsprechenden Typen implementiert, z. int implementiert numbers.Integral.

von numbers.Number als Basisklasse verwenden, werden Sie alle Operationen von dieser Klasse in MyNumber haben, aber wenn man es mit einem Wert wie MyNumber(2) instanziiert werden Sie TypeError: object() takes no parameters bekommen.

+1

Seit [dieser Abschnitt] (https://www.python.org/dev/peps/pep-3141/#numeric-classes) in PEP 3141 für das Modul 'numbers' sagt die abstrakte Klasse' Number' keine Operationen, scheint es, dass "alle Operationen" daraus zu erben ist etwas bedeutungslos. Wie ich in meiner eigenen Antwort schrieb, ist es unklar, was das OP erreichen will, indem es tut, was sie fragen. – martineau

+0

Einverstanden, die Frage ist unklar und meine Antwort erfüllt wirklich nur die grundlegende Anforderung von dem, was das OP fragte, während es größtenteils nutzlos war. – metame

0

Vielleicht haben Sie vom int-Typ erben:

class MyClass(int): 
    .... 
Verwandte Themen