• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python przekazanie funckcji jako metoda dla konstruktora obiektu

VPS Starter Arubacloud
0 głosów
1,002 wizyt
pytanie zadane 29 września 2017 w Python przez 0xf Dyskutant (8,180 p.)

Czesc chcialbym w konstruktorze mojej klasy w pythonie przekazac funkcje. 

Chcialbym zeby ta funkcja zostala zapisana jako metoda tej klasy chcialbym zrobic mniej wiecej cos takiego. 

class Class:
   def __init__(self,funkcja1()):
   def metoda1():
      return funkcja1()

Z gory dzieki za pomoc

komentarz 29 września 2017 przez Ehlert Ekspert (212,630 p.)
Nie znam się na Pythonie, ale to, co chcesz zrobić jest bez sensu.
komentarz 29 września 2017 przez 0xf Dyskutant (8,180 p.)
moze powiem co dokladnie robie mam klase Transaction i w niej metode realise(). Jako ze kazda transakcje realizuje przy korzystaniu z innych API to co transakcja to szereg roznych operacji a poza sposobem realizacji to kazda transakcja ma te same pola itp. Dlatego chce w konstruktorze obiektu przekazac mu za pomoca jakiej funkcji ma zrealizowac ta transakcje jesli go o to poprosze.
komentarz 29 września 2017 przez Ehlert Ekspert (212,630 p.)

W takim przypadku nie korzystasz z funkcji jako argument, tylko z dziedziczenia​​​​​​. 

​​​

komentarz 29 września 2017 przez 0xf Dyskutant (8,180 p.)
Korzystajac z dziedziczenia pojawia mi sie problem ze co nowy sposob wykonywania transakcji musze tworzyc nowa klase :/

3 odpowiedzi

0 głosów
odpowiedź 29 września 2017 przez Dexterim Dyskutant (8,370 p.)

Funkcje jak każdy inny parametr w pythonie przekazuje sie tak samo więc nie trzeba dodawać nawiasów 

żeby otrzymać funkcje dla klasy wystarczy napisać coś takiego:

class Class:
   def __init__(self,funkcja1):
        self.metoda1 = funkcja1

   
def fun():
    print("Correct !")

exmp = Class(fun)

exmp.metoda1()

W takim przypadku nasza metoda staje sie aliasem do funkcji fun

0 głosów
odpowiedź 29 września 2017 przez Ehlert Ekspert (212,630 p.)
Nawiązując do naszej rozmowy z komentarzy zalecam Ci tworzenie nowych klas. Robiąc integracje z kolejnymi api tworzysz zupełnie inny kod. Każde api ma inne endpointy i udostępnia inne funkcje.

Poza tym łatwiej jest z debugowaniem.
0 głosów
odpowiedź 29 września 2017 przez mokrowski Mędrzec (155,460 p.)

To co chcesz zrobić to tak naprawdę wzorzec strategii. Jeśli tak, to w języku Python należy i jest to naturalne użyć wstrzyknięcia metody. Ten język oferuje taki dynamizm. Trzeba jednak rozważyć czy ta wstrzykiwana metoda ma działać na rzecz obiektu czy klasy. Najczęściej chodzi Ci o wstrzyknięcie/zastąpienie w kontekście klasy. Możesz wtedy to zrobić tak:

import types

class ConnectionStrategy:

    def __init__(self, func=None):
        self.name = 'ConnectionStrategy'
        if func is not None:
            self.connect = types.MethodType(func, self)

    def connect(self):
        print(self.name + ' unknown')


def connect_database1(self):
    print(self.name + ' connect to database 1')


def connect_database2(self):
    print(self.name + ' connect to database 2')


if __name__ == '__main__':
    strat0 = ConnectionStrategy()

    strat1 = ConnectionStrategy(connect_database1)
    strat1.name = 'ConnectionStrategy example 1'

    strat2 = ConnectionStrategy(connect_database2)
    strat2.name = 'ConnectionStrategy example 2'

    strat0.connect()
    strat1.connect()
    strat2.connect()

 

komentarz 29 września 2017 przez 0xf Dyskutant (8,180 p.)
wow wyglada ciekawie tylko nie rozumiem do czego ten print? i co znaczy to if __name__ == '__main__':
komentarz 29 września 2017 przez mokrowski Mędrzec (155,460 p.)
print() jest tylko po to byś wiedział jak kod działa bo to przykład zastosowania. Dostaniesz komunikaty na konsolę jeśli go uruchomisz. A co do if __name__... to doczytaj. To jest typowe uniwersalne uruchamianie kodu jako samodzielny lub jako moduł (bo nie wiem jak go będziesz chciał użyć). Ogólnie taka "zwroka" pojawia się w każdym programie w języku Python :-)
komentarz 29 września 2017 przez 0xf Dyskutant (8,180 p.)
    def __init__(self,TransactionName,currency,stop_loss,profitability=None):
        self.transactioname=TransactionName
        self.profitability=profitability()
        self.currency=currency
        self.stop_loss=stop_loss
        self.update_prof()=types.MethodType(profitability,self)
    def update_prof(self):
        return

Sprobowalem zrobic cos takiego ale mam Can't assign to function call

komentarz 29 września 2017 przez mokrowski Mędrzec (155,460 p.)
Czy w moim self.connect są nawiasy w trakcie przypisana? ;)
komentarz 29 września 2017 przez 0xf Dyskutant (8,180 p.)
Ok zmienione, jendnak nie do konca rozumiem tego mechanizmu :/

Podobne pytania

+1 głos
2 odpowiedzi 853 wizyt
pytanie zadane 25 marca 2021 w Python przez Patryk01 Obywatel (1,270 p.)
0 głosów
1 odpowiedź 97 wizyt
0 głosów
1 odpowiedź 434 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...