getter và setter được lưu trữ dưới dạng các thuộc tính của đối tượng
obj.mode = 'test'
AttributeError: can't set attribute
7 [tương ứng là obj.mode = 'test'
AttributeError: can't set attribute
8 và obj.mode = 'test'
AttributeError: can't set attribute
0], vì vậy ngay khi bạn quá tải thuộc tính trong một lớp con, bạn sẽ cung cấp rõ ràng nhất cả getter và setter, tức làclass B[A]:
@property
def mode[self]:
return self._mode
@mode.setter
def mode[self, value]:
self._mode = value
Vì vậy, nếu bạn muốn làm cho getter và/hoặc setter có thể quá tải mà không phải khai báo lại thuộc tính, bạn phải xác định một phương thức
obj.mode = 'test'
AttributeError: can't set attribute
1 và ủy quyền getter của thuộc tính cho phương thức này, giống như bạn đã làm với setterclass A[object]:
def __init__[self]:
self._mode = None
@property
def mode[self]:
return self._get_mode[]
def _get_mode[self]:
# to be overriden in subclass to implement the actual getter code
raise NotImplementedError
@mode.setter
def mode[self, value]:
# common assertions and input validations
self._set_mode[value]
def _set_mode[self, value]:
# to be overriden in subclass to implement the actual setter code
raise NotImplementedError
class B[A]:
def _get_mode[self]:
return self._mode
def _set_mode[self, value]:
self._mode = value
đã trả lời 13 tháng 3 năm 2017 lúc 12. 22
Tương tự với việc sử dụng
obj.mode = 'test'
AttributeError: can't set attribute
2 bên trong định nghĩa của obj.mode = 'test'
AttributeError: can't set attribute
3, câu trả lời này cho một câu hỏi liên quan gợi ý sử dụng thuộc tính của lớp cơ sở để xác định thuộc tính trên lớp con như vậyclass B[A]:
@A.mode.getter # only this line is changed!
def mode[self]:
return self._mode
def _set_mode[self, value]:
self._mode = value
Ở đây,
obj.mode = 'test'
AttributeError: can't set attribute
2 sẽ giống như đối với obj.mode = 'test'
AttributeError: can't set attribute
3, nhưng chúng tôi đã thay thế getterđã trả lời 2 tháng 3 năm 2021 lúc 22. 02
asenasenarseniiv
982 huy hiệu bạc7 huy hiệu đồng
Nó hoạt động với tôi theo cách này
class A:
@property
def mode[self]:
raise NotImplemented
@mode.setter
def mode[self, value]:
raise NotImplemented
class B[A]:
@A.mode.setter
def mode[self, value]:
# your setter implement here
đã trả lời Ngày 1 tháng 8 năm 2021 lúc 17. 41
gọn gàng gọn gàng
1531 huy hiệu bạc7 huy hiệu đồng
Kế thừa Python @property đúng cách
Đưa ra một lớp
obj.mode = 'test'
AttributeError: can't set attribute
6 với thuộc tính obj.mode = 'test'
AttributeError: can't set attribute
7, obj.mode = 'test'
AttributeError: can't set attribute
8 có thể kế thừa và quá tải thuộc tính trong khi truy cập trình lấy và đặt thuộc tính obj.mode = 'test'
AttributeError: can't set attribute
6Mặc dù chúng ta chỉ có thể triển khai lại hoàn toàn logic thuộc tính
class B[A]:
@property
def mode[self]:
return self._mode
@mode.setter
def mode[self, value]:
self._mode = value
0 mà không cần sử dụng bất kỳ điều gì khác của class B[A]:
@property
def mode[self]:
return self._mode
@mode.setter
def mode[self, value]:
self._mode = value
1, nhưng điều này sẽ vi phạm nguyên tắc DRY và quan trọng hơn, nó sẽ không cho phép đa kế thừa phù hợp [như minh họa trong ví dụ class B[A]:
@property
def mode[self]:
return self._mode
@mode.setter
def mode[self, value]:
self._mode = value
2 bên dưới]Hai lựa chọn
8 định nghĩa lại hoàn toàn thuộc tínhobj.mode = 'test' AttributeError: can't set attribute
7, cả getter và setterobj.mode = 'test' AttributeError: can't set attribute
8 sử dụng thuộc tínhobj.mode = 'test' AttributeError: can't set attribute
1 và chỉ quá tải setter. lớpclass B[A]: @property def mode[self]: return self._mode @mode.setter def mode[self, value]: self._mode = value
6 phải được tham chiếu rõ ràngobj.mode = 'test' AttributeError: can't set attribute
Trong cả hai mẫu, sử dụng
class B[A]:
@property
def mode[self]:
return self._mode
@mode.setter
def mode[self, value]:
self._mode = value
8 cũng đơn giản nhưTuy nhiên, truy cập
class B[A]:
@property
def mode[self]:
return self._mode
@mode.setter
def mode[self, value]:
self._mode = value
9 dài dòng hơnobj.mode = 'test'
AttributeError: can't set attribute
4Sẽ thật tuyệt nếu chỉ
class A[object]:
def __init__[self]:
self._mode = None
@property
def mode[self]:
return self._get_mode[]
def _get_mode[self]:
# to be overriden in subclass to implement the actual getter code
raise NotImplementedError
@mode.setter
def mode[self, value]:
# common assertions and input validations
self._set_mode[value]
def _set_mode[self, value]:
# to be overriden in subclass to implement the actual setter code
raise NotImplementedError
class B[A]:
def _get_mode[self]:
return self._mode
def _set_mode[self, value]:
self._mode = value
0 nhưng điều này sẽ không hoạt động do triển khai hiện tại của class A[object]:
def __init__[self]:
self._mode = None
@property
def mode[self]:
return self._get_mode[]
def _get_mode[self]:
# to be overriden in subclass to implement the actual getter code
raise NotImplementedError
@mode.setter
def mode[self, value]:
# common assertions and input validations
self._set_mode[value]
def _set_mode[self, value]:
# to be overriden in subclass to implement the actual setter code
raise NotImplementedError
class B[A]:
def _get_mode[self]:
return self._mode
def _set_mode[self, value]:
self._mode = value
1 [như Python 3. 7]. Có một vấn đề Python liên quan đến hành vi khá không trực quan nàyCác thuộc tính có được kế thừa trong Python không?
Kế thừa cho phép chúng ta định nghĩa một lớp kế thừa tất cả các phương thức và thuộc tính từ một lớp khác