Czy można dodawać właściwości i metody specjalne do modułów? Chcę zdefiniować moduł taki, że importowanie działa jak instancja klasy, a ciało działa jako definicja klasy. Zasadniczo należy unikać brzydkiej składni:Czy moduły mogą mieć właściwości?
import game
if game.Game().paused:
print("The game is paused")
E.g. moduł gra będzie wyglądać następująco:
_Speed = 1
@property
def paused():
return _Speed == 0
i plik, używając go:
import game
if game.paused:
print("The game is paused")
Ponadto, możliwe jest zdefiniowanie specjalnych metod (takich jak __call__
)?
Dla jasności nie rozróżniam metod klasy/instancji, ponieważ używam klasy game.Game
jako klasy singleton/borg.
Testowałem używając @property i definiując __bool__
, ale żadne z nich nie działa tak, jak miałem nadzieję.
Edit (informacja o tym, dlaczego chcę użyć właściwość):
Mam właściwość game.speed
, funkcję game.paused()
i funkcję game.pause(bool)
. Zasadniczo mam tymczasową zmienną używaną do przechowywania prędkości gry, gdy gra jest wstrzymana. Istnieje prywatna zmienna prędkości, która jest ustawiona na zero, gdy gra jest wstrzymana. Nigdy nie chcę, aby użytkownik widział prędkość jako zero, i był w stanie zmienić prędkość, podczas gdy gra jest wstrzymana, tak aby po wznowieniu gry używał nowej prędkości.
Dlaczego po prostu nie używać 'z gry import gry'? –
Jak działają właściwości? Metaclass? W jaki sposób metaklasa odnosi się do klasy Game? – Darthfett
Mówię, że jeśli używasz składni 'from ... import', nie potrzebujesz * właściwości w module. Osoby korzystające z tego modułu nie oczekują właściwości na nim, więc jeśli usuniesz właściwości z modułu i po prostu użyjesz 'form ... import' we własnym kodzie, uzyskasz tę samą czytelność, ale twój interfejs API będzie lepszy dostosuj się do oczekiwań innych programistów, co jest Dobrą Rzeczą. –