858 Stimmen

Hinzufügen einer Methode zu einer existierenden Objektinstanz

Ich habe gelesen, dass es in Python möglich ist, eine Methode zu einem bestehenden Objekt (d.h. nicht in der Klassendefinition) hinzuzufügen.

Ich verstehe, dass das nicht immer gut ist. Aber wie könnte man das machen?

3voto

Acuminate Punkte 1236

Was Jason Pratt geschrieben hat, ist richtig.

>>> class Test(object):
...   def a(self):
...     pass
... 
>>> def b(self):
...   pass
... 
>>> Test.b = b
>>> type(b)
<type 'function'>
>>> type(Test.a)
<type 'instancemethod'>
>>> type(Test.b)
<type 'instancemethod'>

Wie Sie sehen können, unterscheidet sich b() in Python nicht von a(). In Python sind alle Methoden nur Variablen, die zufällig Funktionen sind.

0voto

Gerard G Punkte 141

Wie man eine Klasse aus einer Instanz einer Klasse wiederherstellt

class UnderWater:
    def __init__(self):
        self.net = 'underwater'

marine = UnderWater() # Instantiate the class

# Recover the class from the instance and add attributes to it.
class SubMarine(marine.__class__):  
    def __init__(self):
        super().__init__()
            self.sound = 'Sonar'

print(SubMarine, SubMarine.__name__, SubMarine().net, SubMarine().sound)

# Output
# (__main__.SubMarine,'SubMarine', 'underwater', 'Sonar')

-1voto

danbst Punkte 2973

Abgesehen von dem, was andere gesagt haben, habe ich festgestellt, dass __repr__ y __str__ Methoden können nicht auf Objektebene monkeypatched werden, weil repr() y str() Klassenmethoden verwenden, nicht lokal begrenzte Objektmethoden:

# Instance monkeypatch
[ins] In [55]: x.__str__ = show.__get__(x)                                                                 

[ins] In [56]: x                                                                                           
Out[56]: <__main__.X at 0x7fc207180c10>

[ins] In [57]: str(x)                                                                                      
Out[57]: '<__main__.X object at 0x7fc207180c10>'

[ins] In [58]: x.__str__()                                                                                 
Nice object!

# Class monkeypatch
[ins] In [62]: X.__str__ = lambda _: "From class"                                                          

[ins] In [63]: str(x)                                                                                      
Out[63]: 'From class'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X