2016-04-26 7 views
0

Gibt es eine Möglichkeit, den Attribut-Namespace einer Klasseninstanz in eine Methode zu importieren?Instanz-Namespace in eine Methode importieren

Gibt es auch eine Möglichkeit, die Ausgabe direkt in den Attributnamensraum der Instanz zu leiten?

Betrachten wir zum Beispiel diese einfache Code-Block:

class Name(): 
    def __init__(self,name='Joe'): 
     self.name = name 

    def mangle_name(self): 
     # Magical python command like 'import self' goes here (I guess) 
     self.name = name + '123' # As expected, error here as 'name' is not defined 

a_name = Name() 
a_name.mangle_name() 
print(a_name.name) 

Wie erwartet, wird dieser Block von Code schlägt fehl, da name nicht erkannt. Was ich erreichen möchte ist, dass die Methode mangle_name den Attributnamensraum von self durchsucht, um nach name zu suchen (und im Beispiel 'Joe' findet). Gibt es einen Befehl, so dass das Attribut Namespace von self importiert wird, so dass es kein Fehler sein, und der Ausgang wird sein:

>>> Joe123 

Ich verstehe, dass dies wahrscheinlich eine schlechte Praxis ist, aber unter bestimmten Umständen würde es machen der Code viel klarer ohne viele Referenzen auf self. etwas in ihm. Wenn dies stattdessen "so schrecklich und niemals getan werden" ist, können Sie bitte erklären, warum?

In Bezug auf den zweiten Teil der Frage, was ich tun möchte, ist:

class Name(): 
    def __init__(self,name='Joe'): 
     self.name = name 

    def mangle_name(self): 
     # Magical python command like 'import self' goes here (I guess) 
     name = name + '123' # This line is different 

a_name = Name() 
a_name.mangle_name() 
print(a_name.name) 

Wo dieser Code die Ausgabe zurückgibt:

>>> Joe123 

Der Versuch, den Befehl import self gibt ein Modul nicht Fehler gefunden

Ich benutze Python 3.5 und würde daher eine Python 3.5-kompatible Antwort bevorzugen.

EDIT: Für Klarheit.

Antwort

0

Also in Ihrem mangle_name Funktion, Sie bekommen den Fehler weil Sie nicht den Namen Variable

self.name = name + '123' 

self.name = self.name + '123' 

oder etwas sein sollte, ähnlich

+0

Ja, das ist mir klar. Meine Frage bezieht sich auf das Importieren des Namespace der Instanz, so dass die Zeile im Beispiel als gültiger Code betrachtet wird. – Charlie

+0

Sie müssen nicht selbst importieren, der Code wird ordnungsgemäß ausgeführt, sobald Sie die Änderung vorgenommen haben. Ihre Klassenfunktion hat bereits Zugriff auf das Klassenattribut. –

+0

Bei dieser Frage geht es nicht darum, wie das Beispiel so einfach wie möglich funktioniert - die Frage ist, wie der Attribut-Namespace einer Instanz importiert werden soll. Unter bestimmten Umständen würde es den Code viel klarer machen, ohne viele Hinweise auf sich selbst zu haben. – Charlie

2

@ martin-lear definiert haben hat den zweiten Teil Ihrer Frage richtig beantwortet. Um den ersten Teil zu adressieren, würde ich diese Beobachtungen anbieten:

Erstens gibt es keine Spracheigenschaft, die es erlaubt, den Namespace der Instanz in den Methodenbereich zu "importieren", außer Attributsuchen auf self durchzuführen.

Sie könnten wahrscheinlich exec oder eval missbrauchen und die __ dict __ der Instanz so etwas zu bekommen, was Sie wollen, aber Sie würden die Instanz-Namespace in die Methode Umfang zu Beginn des Verfahrens und aktualisieren Sie die Instanz manuell abladen müssen __dict __ Am Ende.

Auch wenn dies getan werden kann, sollte es jedoch vermieden werden.Quellcode ist in erster Linie ein Mittel zur Kommunikation zwischen Menschen, und wenn Ihr Code die Erwartungen seiner Leser derart verletzt, wird er schwieriger zu verstehen und zu lesen sein, und die Kosten dafür werden im Laufe der Zeit die Kosten für die Eingabe übersteigen self vor Instanzvariablennamen. Das Prinzip, dass Sie code as if the future maintainers are psychopaths who know where you live sollten, gilt hier.

Schließlich betrachten Sie, dass die Irritation, self viel zu geben, Ihnen etwas über Ihr Design sagt. Vielleicht müssen Sie etwas wie self.a + self.b + self.c + self.d + self.e + self.f + self.g + self.h + .... eingeben, um zu signalisieren, dass Ihnen eine Abstraktion fehlt - in diesem Fall vielleicht eine Sammlung - und Sie sollten Ihre Klasse so gestalten, dass Sie nur sum(self.foos) eingeben müssen.

Verwandte Themen