抽象基类属性设置器的缺失不会阻止类实例化

问题描述 投票:0回答:1

我正在尝试让抽象属性发挥作用,在下游类中强制执行属性 getter 和 setter 定义。

from abc import ABC, abstractmethod


class BaseABC(ABC):
    @property
    @abstractmethod
    def x(self):
        pass

    @x.setter
    @abstractmethod
    def x(self, value):
        pass


class MyClass(BaseABC):
    def __init__(self, value):
        self._x = value
    
    @property
    def x(self):
        return self._x

    # @x.setter
    # def x(self, val):
    #     self._x = val


obj = MyClass(10)
print(obj.x)
obj.x = 20
print(obj.x)

阅读完文档后,似乎表明上面的内容应该在构建类时触发

TypeError
,但只有在设置属性后才会触发
AttributeError

为什么通过

BaseABC
@abstractmethod
中显式定义的缺席设置器不会触发预期的 TypeError? 如何确保子类中需要一名 setter?

python class properties abstract-class
1个回答
0
投票
MyClass

中,

property
使用给定的 getter 和
no
setter 创建一个全新的属性;它并不简单地覆盖继承属性的 getter。 要“继承”抽象设置器,请使用

class MyClass(BaseABC): @BaseABC.x.getter def x(self): return self._x

使用 
BaseABC.x

的新属性“覆盖”

BaseABC.x.setter
,但使用新的给定 getter。要使
MyClass
可实例化,您仍然需要使用
x.setter
提供具体的 setter。
    

© www.soinside.com 2019 - 2024. All rights reserved.