Tôi đã nhìn vào câu trả lời cho câu hỏi này: Is it possible to define a class constant inside an Enum?Python: Constant Lớp
gì quan tâm đến tôi là hầu hết các lớp liên tục trong câu trả lời Ethan Furman của.
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)
Câu hỏi là về Python 3.4 nhưng tôi đang sử dụng 2.7. Trong câu trả lời Ethan đặt hằng số hấp dẫn như là một biến thể hiện của Planet lớp như vậy:
G = Constant(6.67300E-11)
thử nghiệm của tôi về lớp này trong 2,7 cho thấy cách gõ chỉ G mang lại cho tôi điều này:
Out[49]: Constant(3)
(Tôi đặt nó thành 3 để dễ sử dụng trong khi thử nghiệm.Điều này trông giống như đầu ra __repr__
với tôi, xin vui lòng sửa tôi nếu tôi "sai".
Giá trị có sẵn thông qua G.value. Tuy nhiên, trong câu trả lời của Ethan sử dụng
return self.G * self.mass/(self.radius * self.radius)
Điều này rõ ràng chỉ hoạt động nếu giá trị được trả về so với đầu ra __repr__
. Bây giờ, nếu tôi thay đổi class Constant:
thành class Constant(int):
thì nhập G Tôi vẫn nhận được kết quả __repr__
nhưng nếu tôi nhập G * 4
Tôi nhận được 12
không phải là lỗi tôi đã nhận được. (TypeError: loại toán hạng không được hỗ trợ (s) cho *: 'instance' và 'int' )
Vì vậy, rõ ràng một cái gì đó giống như đối tượng int có thể xuất ra một số khi được gọi. Có một phương pháp phép thuật nào mà tôi bỏ lỡ, cho phép tôi làm điều này cho lớp Constant không? Vì hằng số có thể là chuỗi, số nguyên hoặc float Tôi muốn có 1 lớp xử lý tất cả chúng so với 3 lớp riêng biệt để mở rộng các đối tượng đó.
Giá trị cũng có thể đặt qua G.value. Tôi có thể khóa cái này xuống để lớp Constant hoạt động như một hằng số thực tế? (Tôi nghi ngờ câu trả lời là không.)
Tại sao bạn muốn nó không đổi? – Veedrac
@Veedrac Tại sao tôi không muốn các hằng số? Hoặc chỉ đọc các giá trị trong một lớp học? Từ việc đọc của tôi trên Python, tôi hiểu rằng nó phản đối triết lý "Chúng ta đều là người lớn đồng ý" của Python. Tôi thực sự thích Python cho đến nay nhưng tôi nghĩ rằng triết lý là một sự giám sát. Tôi lập trình cho tôi, bản thân mình và tôi - không ai khác đọc nó hoặc sử dụng nó. Sau khi viết bằng nhiều ngôn ngữ trong 15 năm qua, tôi đã học được một vài điều. Một trong những điều đó là tôi có thể ngăn chặn những ngày đáng để gỡ lỗi bằng cách đơn giản thiết kế một lớp mà ở đó những thứ nhất định không thể thay đổi bên ngoài nội bộ của lớp đó. –
Tôi đã tự hỏi ở cấp độ nào bạn yêu cầu nó là hằng số; quan điểm của tôi là kiểm tra xem bạn có OK với "liên tục thông qua giao diện công cộng" hay không, đó là cách làm đúng, hoặc bạn thực sự muốn nó là * hoàn toàn * liên tục, điều đó là không thể. – Veedrac