2010-12-26 4 views
1

Ich habe nichts gefunden. Ich möchte dies tun, ohne den Namen innerhalb des Konstruktors zu übergeben.Den Bezeichnernamen einer Instanz in Python erhalten

class foo: 
    pass 
something = foo() 

Ich möchte, dass jede Instanz von foo den ursprünglichen Bezeichnernamen kennt. In diesem Fall sollte die Instanz von foo(), die ich erstellt habe, darauf achten, dass ihr Bezeichner die Zeichenfolge "something" ist.

Ich arbeite an einer kleinen API und dies wäre ein sehr eleganter Ansatz, leider habe ich nichts gesehen so gemacht.

Danke,

+2

Was ist das Verhalten, wenn Sie tun: bar (foo())? – carl

+1

Dies ist sehr schwierig in irgendeiner sinnvollen Weise zu tun. Für eine einfache Zuweisung sollte [this] (http://stackoverflow.com/questions/3744792/accessing-the-name-that-an- object-being-created -is-assigned-to/4190682#4190682) funktionieren. Es wird für etwas kompliziertes obwohl brechen. – aaronasterling

Antwort

4

Auch wenn Sie diese — tun konnten, das Sie nicht — kann es wäre ein Missbrauch der Sprache. Bitte vermeiden Sie verstecktes "magisches" Verhalten, damit Sie Ihren Code lesen können. Python-Programmierer würden nicht erwarten, dass ihre lokalen Variablennamen aussagekräftig sind und tatsächlich externem Code ausgesetzt sind.

4

Sie können nicht. Die Erstellung eines Objekts ist völlig unabhängig davon, ob einer benannten Variablen eine Referenz auf dieses Objekt zugewiesen wird.

foo().doSomething() - eine Instanz von foo ist an keinen Namen gebunden und wird wahrscheinlich direkt nach dem Aufruf mit Müll versorgt.

a[1].moo = foo() - wie lautet der Name?

a = foo() 
b = a # is name of foo 'a' or 'b'? both point to the same instance 
a = None # but 'a' is gone, so now the name is 'b'?.. 

OTOH, ist einen Namen für den Konstruktor schmerzlos:

my_foos = {} 
for name in ('a', 'b', 'c'): 
    my_foos[name] = foo(name) 

Sie können sogar eine Instanz Attribut unsanft zuweisen, wenn Sie den Konstruktor aus irgendeinem Grund nicht ändern wird:

my_foos = {} 
for name in ('a', 'b', 'c'): 
    a_foo = foo() 
    a_foo.my_mame = name # here 
    my_foos[name] = a_foo 

Und wenn Sie in der dunklen Seite sind, können Sie schließlich Ihre Foos globalen Namespace hinzufügen: globals().update(my_foos) - jetzt haben Sie globale Namen a, b und c, die sich jeweils auf einen passend genannten foo beziehen.

Und um ihrer selbst willen foo, nennen Sie Ihre Klassen mit einem Großanfangsbuchstaben :)

2

Soweit ich weiß, in Python eine Variable nur ein Name zu einem gewissen Objektinstanz bezieht, ist. Sie können viele Namen haben, die auf dieselbe Instanz verweisen. die Instanz ist sich ihrer Namen nicht bewusst (sollte es auch nicht sein, IMHO); Derselbe Name kann später erneut verwendet werden, um auf eine andere Instanz einer vollständig anderen Klasse zu verweisen.

Angesichts der Python data model ist schwer zu sehen, warum für das Objekt nützlich sein könnte zu wissen, wie es in einigen Namespace benannt ist.

Sie können Verweise auf Ihre Instanzen in einer Klassenvariablen oder einem anderen Container speichern, aber das ist in Python nicht sehr häufig - da Namespaces solche natürlichen und eleganten Container sind.

Verwandte Themen