2009-02-05 4 views
31

Hat Python Erweiterungsmethoden wie C#? Ist es möglich, eine Methode, wie zu nennen:Erweiterungsmethoden in Python

MyRandomMethod() 

auf bestehende Typen wie int?

myInt.MyRandomMethod() 
+1

klingt wie "Affe flicken" – hop

Antwort

39

Sie stellt klar, kann Methoden hinzufügen, die Sie für Klassenobjekte mögen, die in Python-Code (AKA-Affe-Patching) definiert sind:

Dies funktioniert nicht für integrierte Typen, da deren nicht beschreibbar ist (es ist ein dictproxy).

Also nein, es gibt keinen "echten" Erweiterungsmethodenmechanismus in Python.

+3

Je länger ich Python verwende, desto besser wird es! –

7

nicht sicher, ob das, was Sie fragen, aber Sie können bestehende Typen erweitern und rufen Sie dann, was Sie auf der neuen Sache mag:

class int(int): 
    def random_method(self): 
      return 4      # guaranteed to be random 
v = int(5)        # you'll have to instantiate all you variables like this 
v.random_method() 

class int(int): 
    def xkcd(self): 
     import antigravity 
     print(42) 

>>>v.xkcd() 
Traceback (most recent call last): 
    File "<pyshell#81>", line 1, in <module> 
    v.xkcd() 
AttributeError: 'int' object has no attribute 'xkcd' 
c = int(1) 
>>> c.random_method() 
4 
>>> c.xkcd() 
42 

Hoffnung, dass Ihre Frage

+0

Aber ich meine direkt auf vorhandene Typen aufrufen, nicht MyInt, aber Int. Also wie v = 5; v.RandomMethod(); –

+0

Sie können die Klasse int (int) aufrufen, aber Sie müssten die Variable instanziieren wie: v = int (5) – SilentGhost

+3

Nice XKCD Referenz. –

0

Eine andere Option ist das Überschreiben der Meta-Klasse. Damit können Sie unter anderem Funktionen angeben, die in allen Klassen existieren sollen.

Dieser Artikel beginnt es zu diskutieren:

http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html

+0

Funktioniert das für eingebaute Typen wie int? –

+1

Ich glaube nicht, dass Metaklassen Ihnen die Möglichkeit geben, integrierte Typen zu ändern. –

+0

Das stimmt, es kann nur das Verhalten von Klassen ändern. – tsellon