2011-10-13 11 views
10

jeśli mam coś takiegododatek do załadowanego klasy/modułu w Pythonie

import mynewclass 

mogę dodać jakiś sposób do mynewclass? Coś jak następujące w koncepcji:

def newmethod(self,x): 
    return x + self.y 

mynewclass.newmethod = newmethod 

(używam CPython 2.6)

+1

Możliwe użycie: http://stackoverflow.com/questions/962962/python-changing-methods-and-attributes-at-runtime –

Odpowiedz

12

W Pythonie oświadczenie import służy do modułów, a nie klas ... więc zaimportować klasę trzeba coś podobnego

from mymodule import MyClass 

więcej do punktu pytanie odpowiedź brzmi: tak. W Pythonie klasy są zwykłymi obiektami, a metoda klasy jest po prostu funkcją zapisaną w atrybucie object.

Atrybuty instancji obiektów w Pythonie są ponadto dynamiczne (można dodawać nowe atrybuty obiektów w środowisku wykonawczym), a fakt ten w połączeniu z poprzednim oznacza, że ​​można dodać nową metodę do klasy w środowisku wykonawczym.

class MyClass: 
    def __init__(self, x): 
     self.x = x 

... 

obj = MyClass(42) 

def new_method(self): 
    print "x attribute is", self.x 

MyClass.new_method = new_method 

obj.new_method() 

Jak to działa? Po wpisaniu

obj.new_method() 

Python będzie wykonać następujące czynności:

  1. wygląd new_method wewnątrz obiektu obj.

  2. Nie znajdując go jako atrybutu instancji spróbuje zajrzeć do obiektu klasy (który jest dostępny pod numerem obj.__class__), gdzie znajdzie tę funkcję.

  3. Teraz jest nieco oszustwa, ponieważ Python zauważy, że to, co znaleziono to funkcja a zatem będzie „wrap” go w zamknięciu, aby stworzyć to, co nazywa się „związany metoda”. Jest to potrzebne, ponieważ podczas wywoływania obj.new_method() chcesz wywołać MyClass.new_method(obj) ... innymi słowy, wiążąc funkcję z obj, aby utworzyć powiązaną metodę, należy uwzględnić dodanie parametru self.

  4. Ta metoda związana jest zwracana przez obj.new_method, a następnie zostanie ostatecznie wywołana z powodu kończącego się () w tym wierszu kodu.

Jeśli poszukiwanie klasy też nie uda zamiast klas macierzyste są również wszystkie wyszukiwane w konkretnym celu znalezienia odziedziczonych metod i atrybutów, a zatem rzeczy są tylko trochę bardziej skomplikowane.

5

Tak, jeśli jest to typ Python. Poza tym, że zrobiłbyś to na klasie, a nie na module/paczce.

Powiązane problemy