2009-04-26 3 views

Antwort

8

In Python Attribute werden mit einem Wörterbuch implementiert:

>>> t = test() 
>>> t.__dict__["foo"] = "bla" 
>>> t.foo 
'bla' 

Aber für "Objekt", es wird ein 'dictproxy' als Schnittstelle so assignement zu verhindern:

>>> object.__dict__["test"] = "test" 
TypeError: 'dictproxy' object does not support item assignment 

Also nein, du kannst nicht.

Hinweis: Sie können den Metaklassen-Typ auch nicht direkt ändern. Aber da Python sehr flexibel ist, bin ich mir sicher, dass ein Guru einen Weg finden kann, um das zu erreichen, was Sie wollen. Jeder schwarze Zauberer hier in der Nähe :-)?

+0

Vielleicht durch Metaklassen? –

+4

Nein, Metaklassen wirken sich nur auf Klassen und Objekte aus, die sie verwenden, nicht auf vorhandenen integrierten Typen wie object, int, str, float und so weiter. Also, "alle Objekte" wird einfach nicht passieren. (Sie können natürlich neue Funktionen in __builtin__ einbauen, was sie ebenso weit verfügbar macht, aber sie werden keine METHODEN des eingebauten Typs des Objekts sein). –

0
 
>>> object.test = "Test" 
Traceback (most recent call last): 
    File "", line 1, in 
TypeError: can't set attributes of built-in/extension type 'object' 

Sieht nicht so aus. (Python 2.5.1)

+0

so ist die Antwort NEIN?)) –

+0

Ich denke schon, aber ich bin mir nicht 100% sicher. –

5

Nein, Pythons Interna sind sehr darauf bedacht, eingebaute Typen NICHT änderbar zu machen - sehr unterschiedliche Designwahlen von Ruby's. Es ist nicht möglich, das Objekt "monkeypatchable" zu machen, ohne tief in die C-codierten Interna zu verfallen und die Python-Laufzeit neu zu kompilieren (dies ist für den klassischen CPython, aber ich glaube, genau das gleiche Prinzip gilt für andere gute Implementierungen wie z als Jython und IronPython, nur s/C/Java/und S/C/C# bzw. ;-).

Verwandte Themen