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

Builer Pattern konstruktor Python

VPS Starter Arubacloud
0 głosów
110 wizyt
pytanie zadane 8 listopada 2020 w Python przez lucyliu Początkujący (370 p.)
edycja 8 listopada 2020 przez lucyliu

Cześć,

Próbuję napisać BuilderPattern. Mam taki problem, że gdy budując nowy obiekt próbuje sie odwołać do metody setSubregion_id() to wyskakuje mi taki błąd:

TypeError: setSubregion_id() missing 1 required positional argument: 'subregion_id' from Builder.Instance import Instance from Builder.InstanceBuilder import InstanceBuilder from Builder.Subregions import Subregions def main(): instance = InstanceBuilder.setSubregion_id(Subregions.PL001).build if __name__ == "__main__": main()

Nie wiem też czy to odwołanie w klasie InstanceBuilder jest poprawne: self.subregion_id = Subregions()

Używałam wcześniej Javy i nie do końca wiem o co mu chodzi ;) 

from enum import Enum, unique

@unique
class Subregions(Enum):

    PL001 = 1
    PL002 = 2
   
class InstanceBuilder(object):

    def __init__(self):
      
        self.subregion_id = Subregions()
       


    def getSubregion_id(self):
        return self.subregion_id

    def setSubregion_id(self, subregion_id):
        subregion_id = Subregions()
        return subregion_id
class Instance():

    def __init__(self, subregion_id ):
        
        self.subregion_id = subregion_id

from Builder.InstanceBuilder import InstanceBuilder
from Builder.Subregions import Subregions

def main():

    instance = InstanceBuilder.setSubregion_id(Subregions.PL001).build

if __name__ == "__main__":
    main()

 

komentarz 8 listopada 2020 przez reaktywny Nałogowiec (40,650 p.)
Przekazujesz PL001, a masz:

   PL002 = 1

   PL002 = 2

??
komentarz 8 listopada 2020 przez lucyliu Początkujący (370 p.)
w kodzie mam PL001, źle skopiowałam.

1 odpowiedź

+1 głos
odpowiedź 8 listopada 2020 przez adrian17 Ekspert (344,100 p.)
edycja 8 listopada 2020 przez adrian17
InstanceBuilder

Nie tworzysz obiektu (nie wywołujesz funkcji)

.build

Tutaj też zgubiłaś nawiasy :(

Poza tym...

    def setSubregion_id(self, subregion_id):
        subregion_id = Subregions()
        return subregion_id

Ten setter nic nie robi... i raczej powinien zwracać self?

A ogólnie, to builder pattern jest w Pythonie prawie w ogóle nie używany - bo Python oferuje wbudowane funkcjonalności języka (nazwane opcjonalne parametry), które czynią go niepotrzebnym. Ba, niektóre książki do javy wręcz bezpośrednio piszą że builder pattern po prostu symuluje nazwane parametry z Pythona :)

(Ale do nauki pisania klas w Pythonie, czemu nie.)

komentarz 8 listopada 2020 przez lucyliu Początkujący (370 p.)
Potrzebuje, żeby budując nową instancje móc odwołać się do wartości z klasy Subregions.
komentarz 8 listopada 2020 przez adrian17 Ekspert (344,100 p.)

Subregions to tylko enum.

setSubregion_id(Subregions.PL001)

tutaj to zrobiłeś; masz już wartość. Nie do końca wiem z czym masz problem, bo tutaj nie ma wielkich różnic od Javy; nie musisz nigdzie robić `Subregions()`, w Javie też nie musisz (jeśli w ogóle się da).

komentarz 8 listopada 2020 przez lucyliu Początkujący (370 p.)

tak, ale mam błąd: TypeError: setSubregion_id() missing 1 required positional argument: 'subregion_id'

Potrzebuję, żeby metoda setSubregion_id, pozwolila mi w klasie Main budując nową instancję odwołać się do wartości z klasy Subregions. 

komentarz 8 listopada 2020 przez adrian17 Ekspert (344,100 p.)

tak, ale mam błąd: TypeError: setSubregion_id() missing 1 required positional argument: 'subregion_id'

Tak, bo cały czas nie wywołujesz metody na obiekcie.

InstanceBuilder.setSubregion_id(Subregions.PL001)

Tak jak pisałem na początku, zgubiłeś nawiasy.

komentarz 8 listopada 2020 przez lucyliu Początkujący (370 p.)

usunęłam object

class InstanceBuilder():

dodałam nawiasy:

instance = InstanceBuilder().setSubregion_id(Subregions.PL001).build

i pokazuje mi błąd.

Nie wiem jak poprawić tę funkcję by odwoływała się do wartości z klasy Subregions.

    def setSubregion_id(self, subregion_id):
        subregion_id = Subregions()
        return self

 

komentarz 8 listopada 2020 przez adrian17 Ekspert (344,100 p.)
subregion_id = Subregions()

Nie rozumiem, skąd to. Już wyżej napisałem, że to nie ma sensu ani w Javie, ani w Pythonie.

Java:

    public InstanceBuilder setSubregionID(Subregion subregion) {
        this.subregion = subregion;
        return this;
    }

Python:

    def set_subregion_id(self, subregion):
        self.subregion = subregion
        return self

 

komentarz 8 listopada 2020 przez adrian17 Ekspert (344,100 p.)
I pokaż, co teraz masz po poprawkach :)
komentarz 8 listopada 2020 przez lucyliu Początkujący (370 p.)

Po poprawkach wygląda na to, że poprzednie problemy zostały rozwiązane, ale pojawił się kolejny ;) 

W klasie InstanceBuilder mam jeszcze tak: 

  def build(self):
        return Instance(self.subregion_id, .....)
                       

i kiedy w Main probuje zbudować obiekt to mam błąd:

def main():

 instance =InstanceBuilder().setSubregion_id(Subregions.PL001).build()


if __name__ == "__main__":
    main()

  File "C:\instanceBuilder\Main.py", line 15, in <module>
    main()
  File "C:\\instanceBuilder\Main.py", line 10, in main
    instance = InstanceBuilder().setSubregion_id(Subregions.PL001).build()
 

komentarz 8 listopada 2020 przez adrian17 Ekspert (344,100 p.)
ale zacytowałaś tylko połowę błędu :) Wrzucisz cały?

I pełny kod?

Podobne pytania

0 głosów
1 odpowiedź 336 wizyt
pytanie zadane 5 kwietnia 2021 w C i C++ przez Beginner555 Obywatel (1,760 p.)
0 głosów
1 odpowiedź 440 wizyt
pytanie zadane 18 marca 2021 w C i C++ przez ******** Początkujący (260 p.)
0 głosów
1 odpowiedź 204 wizyt
pytanie zadane 31 stycznia 2021 w Java przez p_wel Nowicjusz (120 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 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!

...