2016-08-09 15 views
0

ich eine Klasseninstanz in Member-Funktion einer Klasse zurückkehren wollen, ist mein Code:Wie gibt man eine Klasseninstanz in der Memberfunktion einer Klasse zurück?

class MyClass(object): 
    def __init__(self, *args, **kwargs): 
     [snippet] 

    def func(self, *args, **kwargs): 
     [snippet] 
     return class_instnace_of_MyClass 

if __name__ == '__main__': 
    obj = MyClass(...) 
    newobj = obj.func(...) # type(newobj) is MyClass 

Ich glaube, ich __init__() in func() nennen kann, und gibt eine neue Instanz von MyClass, aber ich glaube nicht, Es ist eine pythonische Art, dies zu tun. Wie soll ich das machen? Vielen Dank!

Antwort

1

Ich fühle mich wie Sie sollten die @classmethod Dekorateur für diese verwenden, wenn ich Ihre Frage richtig lesen. Etwas wie:

class myClass(object): 

    def __int__(name): 
     self.name = name 

    @classmethod 
    def from_fancy(cls, name): 
     #do something with name, maybe make it 
     #lowercase or something... 
     return cls(name) 

Zum Beispiel in dem pandas Paket können Sie ein DateFrame Objekt erstellen, indem Sie Dinge wie pandas.DataFrame.from_csv(...) oder pandas.DataFrame.from_json(...) tun. Jede davon sind Klassenmethoden, die ein Objekt DataFrame zurückgeben, das mit verschiedenen Anfangsdatensätzen (CSV-Textdatei oder JSON-Textdatei) erstellt wurde.

Zum Beispiel würde nennen Sie es mögen:

my_new_object = myClass.from_fancy("hello world") 

Es gibt einen guten Faden auf @classmethodhere

+0

unnötig, die Magie in @classicmethod wird sich darum kümmern, zumindest in Python 2.x . Weiß nicht über Python 3.x – reptilicus

+0

@AlexanderYau Sie nichts tun. Verwenden Sie einfach den Code direkt dort. Nichts anderes. Willkommen in der Einfachheit von Python, Sie werden sich daran gewöhnen müssen. –

+0

@AlexanderYau stellen Sie sicher, dass Sie das wirklich brauchen: Können Sie nicht einfach "__init__" verlängern? Der richtige Weg, um ein Objekt in Python zu erstellen, ist die Verwendung von '__init__'. Alle Methoden in Python sind öffentlich –

2

__init__ ist der Konstruktor der Klasse in Python. In keinem Fall gibt es etwas zurück, was bedeutet, dass der Wert None ist. Es ist sinnlos, ein Argument an func() zu übergeben, das leer ist. Ihre Annahme ist wahr, das ist nicht der pythonische Weg, eine weitere Instanz von MyClass zu erstellen.

Wenn Sie dies eine neue Instanz von MyClass erstellen möchten gerade tun:

obj = MyClass(...) # First instance 
newobj = MyClass(...) # Add another instance 

mehr auf Klassenobjekte lesen und ihre Instanziierung here.

2

Um return eine neue Instanz von einem Verfahren, instanziiert die Klasse in dem Verfahren, und bring diese neue Instanz, etwa so:

class MyClass(object): 
    def __init__(self, *args, **kwargs): 
     pass 

    def func(self, *args, **kwargs): 
     ... 
     return MyClass(...) 

if __name__ == '__main__': 
    obj = MyClass(...) 
    newobj = obj.func(...) 

Oder statt des Merry-go-round, könnten Sie nur newobj = MyClass(...)