Szukałem w odpowiedzi na to pytanie: Is it possible to define a class constant inside an Enum?Python: Stała Klasa
Co interesuje mnie najbardziej, to klasa Stała w odpowiedzi Ethan Furman za.
class Constant:
def __init__(self, value):
self.value = value
def __get__(self, *args):
return self.value
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.value)
Pytanie dotyczyło Pythona 3.4, ale używam 2.7. W odpowiedzi Ethan ustawia stałą grawitacji jako zmiennej instancji o Planet klasy tak:
G = Constant(6.67300E-11)
Mój testowania tej klasy w 2,7 pokazuje, że wpisując tylko G daje mi to:
Out[49]: Constant(3)
(Ustawiłem go na 3 dla łatwości użycia podczas testowania.Jest to dla mnie wyjście __repr__
, proszę poprawić mnie, jeśli się mylę.)
Wartość jest dostępna przez G. wartość, jednak w odpowiedzi Ethana używa
return self.G * self.mass/(self.radius * self.radius)
To oczywiście działa tylko wtedy, gdy zwracana jest wartość w stosunku do wyjścia __repr__
. Teraz, jeśli zmienię class Constant:
na class Constant(int):
, a następnie wpisz G nadal otrzymuję dane wyjściowe __repr__
, ale jeśli wpiszę G * 4
, otrzymam 12
, a nie błąd, który otrzymałem. (TypeError: nieobsługiwane typy argumentów dla *: 'instance' i 'int' )
Tak więc coś podobnego do obiektu int może wyprowadzić liczbę po wywołaniu. Czy brakuje mi magicznej metody, która pozwoliłaby mi to zrobić dla klasy Constant? Ponieważ stałe mogą być ciągami, liczbami całkowitymi lub zmiennymi wolałbym mieć 1 klasę, która obsługuje je wszystkie w stosunku do 3 oddzielnych klas, które rozszerzają te obiekty.
Wartość można również ustawić za pomocą G. wartości. Czy mogę to zablokować, aby zachowywać się w klasie stałej, która lubi stałą rzeczywistą? (Podejrzewam, że odpowiedź brzmi "nie").
Dlaczego chcesz, aby był stały? – Veedrac
@Veedrac Dlaczego nie chciałbym stałych? Lub wartości tylko do odczytu w klasie? Z mojego czytania na Pythonie rozumiem, że jest to sprzeczne z filozofią Pythona "Wszyscy jesteśmy zgodnymi dorosłymi". Naprawdę lubię Pythona, ale myślę, że filozofia to niedopatrzenie. Programuję dla siebie, i dla mnie - nikt inny go nie przeczyta i nie użyje. Po kodowaniu w kilku językach przez ostatnie 15 lat nauczyłem się kilku rzeczy. Jedną z tych rzeczy jest to, że mogę zapobiec debugowaniu dni, po prostu projektując klasę, w której pewnych rzeczy po prostu nie da się zmienić poza wewnętrznymi cechami tej klasy. –
Byłem bardziej zastanawiasz się, na jakim poziomie potrzebujesz stałej wartości; moim celem było sprawdzenie, czy dobrze się czujesz z "stałym przez interfejs publiczny", który jest prawidłowym sposobem robienia tego, lub faktycznie chcesz, aby był * całkowicie * stały, co jest niemożliwe. – Veedrac