Con trỏ trong Python?

Tôi muốn form.data['field']form.field.valueluôn có cùng một giá trị

Đây là khả thi, bởi vì nó liên quan đến tên trang trí và lập chỉ mục – ví dụ, hoàn toàn cấu trúc khác nhau từ barenames abrằng bạn đang yêu cầu về, và cho yêu cầu của bạn là hoàn toàn không thể. Tại sao lại yêu cầu điều không thể hoàn toàn khác với điều (có thể) mà bạn thực sự muốn ?!

Có thể bạn không nhận ra tên trần và tên được trang trí khác nhau đáng kể như thế nào. Khi bạn tham chiếu đến tên trần a, bạn đang nhận được chính xác đối tượng ađược liên kết cuối cùng trong phạm vi này (hoặc một ngoại lệ nếu nó không bị ràng buộc trong phạm vi này) – đây là một khía cạnh sâu sắc và cơ bản của Python mà nó có thể không thể bị lật đổ. Khi bạn tham chiếu đến một tên được trang tríx.y, bạn đang yêu cầu một đối tượng (đối tượng được xtham chiếu đến) vui lòng cung cấp ” ythuộc tính” – và để đáp ứng yêu cầu đó, đối tượng có thể thực hiện các phép tính hoàn toàn tùy ý (và việc lập chỉ mục khá giống nhau: nó cũng cho phép thực hiện các phép tính tùy ý).

Bây giờ, ví dụ “desiderata thực tế” của bạn là bí ẩn vì trong mỗi trường hợp, hai cấp độ lập chỉ mục hoặc nhận thuộc tính đều có liên quan, vì vậy sự tinh tế mà bạn khao khát có thể được giới thiệu theo nhiều cách. form.fieldVí dụ, có những thuộc tính nào khác value? Nếu không có sự .valuetính toán thêm, các khả năng sẽ bao gồm:

Bạn đang đọc: Con trỏ trong Python?

class Form(object):
   ...
   def __getattr__(self, name):
       return self.data[name]

class Form(object):
   ...
   @property
   def data(self):
       return self.__dict__

Sự hiện diện của .valuegợi ý chọn biểu mẫu đầu tiên, cộng với một loại trình bao bọc vô dụng:

class KouWrap(object):
   def __init__(self, value):
       self.value = value

class Form(object):
   ...
   def __getattr__(self, name):
       return KouWrap(self.data[name])

Nếu các phép gán như vậy form.field.value = 23cũng được cho là để thiết lập mục nhập form.data, thì trình bao bọc thực sự phải trở nên phức tạp hơn, và không phải tất cả những điều đó đều vô dụng:

class MciWrap(object):
   def __init__(self, data, k):
       self._data = data
       self._k = k
   @property
   def value(self):
       return self._data[self._k]
   @value.setter
   def value(self, v)
       self._data[self._k] = v

class Form(object):
   ...
   def __getattr__(self, name):
       return MciWrap(self.data, name)

Ví dụ thứ hai gần giống với nghĩa “con trỏ” như bạn muốn – nhưng điều quan trọng là phải hiểu rằng những điều tinh tế như vậy chỉ có thể hoạt động với lập chỉ mục và / hoặc tên được trang trí, không bao giờ với tên trần như bạn đã hỏi ban đầu!

Related Posts

Trả lời

Email của bạn sẽ không được hiển thị công khai.