2017-08-13 63 views
8

Jestem nowy w Pythonie i zastanawiam się, czy istnieje sposób na agregację metod w 'podprzestrzeni'. Mam na myśli coś podobnego do tej składni:Przestrzenie nazw w klasie Python3

smth = Something() 
smth.subspace.do_smth() 
smth.another_subspace.do_smth_else() 

Piszę otoki API i mam zamiar mieć wiele bardzo podobnych metod (tylko inny URI), więc mimo, że byłoby dobrze, aby umieścić je w kilka podprzestrzeni, które odnoszą się do kategorii żądań API. Innymi słowy, chcę utworzyć przestrzeń nazw wewnątrz klasy. Nie wiem, czy jest to możliwe nawet w Pythonie i wiem, czego szukać w Google.

Doceniam każdą pomoc.

+1

Czy rzeczywiście muszą to być metody? Czy potrzebują dostępu do dowolnego stanu? Mógłbyś mieć zagnieżdżone moduły? –

+2

Czy metody takie jak 'do_smth' potrzebują dostępu do instancji, jak zwykłe metody? – BrenBarn

+0

Przechowuję informacje logowania jako atrybuty instancji. Potrzebuję do nich dostępu z każdej metody. Być może istnieje lepszy sposób ich przechowywania. – mDevv

Odpowiedz

2

Jednym ze sposobów, aby to zrobić, definiując subspace i another_subspace jako właściwości, które zwracają obiekty, które zapewniają do_smth i do_smth_else odpowiednio:

class Something: 
    @property 
    def subspace(self): 
     class SubSpaceClass: 
      def do_smth(other_self): 
       print('do_smth') 
     return SubSpaceClass() 

    @property 
    def another_subspace(self): 
     class AnotherSubSpaceClass: 
      def do_smth_else(other_self): 
       print('do_smth_else') 
     return AnotherSubSpaceClass() 

który robi to, co chcesz:

>>> smth = Something() 
>>> smth.subspace.do_smth() 
do_smth 
>>> smth.another_subspace.do_smth_else() 
do_smth_else 

W zależności od tego, co zamierzasz używać tych metod, możesz chcieć uczynić SubSpaceClass singletonem, ale wątpię, żeby wartość wydajności była tego warta.

+1

To jest bardzo eleganckie rozwiązanie i działa zgodnie z przeznaczeniem, dziękuję – mDevv

+1

To działa, ale za każdym razem, gdy uzyskujesz dostęp do 'smth.subspace' lub' smth.another_subspace', tworzony jest nowy obiekt klasy wewnętrznej, co widać przez drukowanie 'else_self' w metodach. Domyślam się, że to nie gorsze niż to, że metody instancji normalnie są przywiązane do każdego połączenia, ale jeśli te wewnętrzne klasy zawierają wiele metod, to spowolni to konieczność ponownego budowania ich za każdym razem. –

+2

@mDevv: Nie zgadzam się. Tak jak PM wskazuje, że za każdym razem tworzy nowy obiekt klasy. Przynajmniej przenieś te klasy z metody. Następnie musisz się także martwić o udostępnianie stanu. Zastanowiłbym się raczej nad refaktoryzacją twojego API, aby nie potrzebował przestrzeni nazw? –