Python tăng notimplementederror

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 setter

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

đã 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ậy

class 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
6

Mặ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

  • obj.mode = 'test'
    AttributeError: can't set attribute
    
    8 định nghĩa lại hoàn toàn thuộc tính
    obj.mode = 'test'
    AttributeError: can't set attribute
    
    7, cả getter và setter

  • obj.mode = 'test'
    AttributeError: can't set attribute
    
    8 sử dụng thuộc tính
    class B(A):
        @property
        def mode(self):
            return self._mode
    
        @mode.setter
        def mode(self, value):
            self._mode = value
    
    1 và chỉ quá tải setter. lớp
    obj.mode = 'test'
    AttributeError: can't set attribute
    
    6 phải được tham chiếu rõ ràng

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ơn

obj.mode = 'test'
AttributeError: can't set attribute
4

Sẽ 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ày

Cá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