Powiedzmy, że mam klasę, Fooklass, która ma metodę, zdefiniowanąmy foo_method. Ta klasa znajduje się w bibliotece osób trzecich i chcę go wyraźnie zastąpić. Mam wiele zajęć, które dziedziczą z Fooclasy, więc nie chcę zastąpić Foo_Method za każdą podklasę. Zamiast tego chciałbym zastąpić definicję metody klasy bez wykopania w kodzie biblioteki osób trzecich. Kiedy próbuję oczywisty sposób,

from thirdparty import FooClass

class FooClass(object):

  def foo_method():
    newstuff

Dostaję dziwne zachowanie - notimplemplementedErrors i takie. Brakowam czegoś?

3
user1427661 10 grudzień 2013, 00:58

2 odpowiedzi

Najlepsza odpowiedź

Przedefiniujesz klasę lokalnie; To nie zmieni oryginalnej klasy ani nie wpływa na nikogo, używając go gdzie indziej.

Can może Monkeypatch Metoda w klasie:

from thirdparty import FooClass

orig_foo_method = FooClass.foo_method

def new_foo_method(self):
    # do new stuff
    # perhaps even call orig_foo_method(self)

FooClass.foo_method = new_foo_method

Teraz każdy kod, który próbuje zadzwonić .foo_method() na wystąpienia FooClass w dowolnym miejscu interpretera Pythona znajdzie i zadzwoń do swojej metody new_foo_method().

5
Martijn Pieters 9 grudzień 2013, 21:01

Pierwszą rzeczą, która przychodzi na myśl, jest użycie prostego spadku Ala

from thirdparty import FooClass

class MyUpdatedClass(FooClass):

  def foo_method():
    newstuff
4
Milo Wielondek 9 grudzień 2013, 21:01