我有一个父类,它包含某种类型的列表,并具有向这些列表添加对象的功能.它是一个抽象类,我永远不会实例化它,而只是将其用作其他子类的蓝图.(那就继承ABC个吧?)

但是我希望,这个父类的一些函数不能直接在Child类上调用.我试着引发了一个异常,但是我不需要为所有的子类做这个样板,这是我不想要的.我还try 了一个装饰符,它引发了异常,但当我在子类中为super().__init__()时,我不能执行初始的列表添加,因为这不会执行Parents类.

class Parent():
    def __init__(self, name:str = None, some_list=[]):
        self.name = name
        self.important_list = []
        for i in some_list:
            self.add_to_list(i)

    def add_to_list(self, x):
        ... # important list manipulation etc

@predefined
class Child(Parent):
    def __init__(self, name:str = None, some_list=[]):
        super().__init__(name, some_list)

    def add_to_list(self, x):
        raise NotImplementedError # this function call shall be prohibited on the child!

def predefined(cls):

    @functools.wraps(cls, updated=())
    class Predefined(cls):
        def add_to_list(self, x): raise NotImplementedError

    return Predefined

我应该使用哪种设计?谢谢!

推荐答案

如果必须,可以通过调用Parent.add_to_list作为父类中的未绑定方法来实现这样的行为.

所以,与其打电话:

self.add_to_list(i)

致电:

Parent.add_to_list(self, i)

因此,即使父类的add_to_list个方法被重写,也可以通过显式调用父类的add_to_list个方法来完成子实例的初始化.

从Python3.6开始,您还可以覆盖父类的__init_subclass__类方法中所有子类的add_to_list方法,这样就不必对每个子类应用修饰符:

class Parent:
    def __init__(self, some_list):
        self.important_list = []
        for i in some_list:
            Parent.add_to_list(self, i)

    def add_to_list(self, x):
        self.important_list.append(x)

    def __init_subclass__(cls):
        def add_to_list(self, x):
            raise NotImplementedError
        cls.add_to_list = add_to_list

class Child(Parent):
    pass

因此:

c = Child([1, 2])
print(c.important_list)
c.add_to_list(3)

输出:

[1, 2]

并筹集了NotImplementedError美元.

演示:Try it online!

Python相关问答推荐

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

Python在tuple上操作不会通过整个单词匹配

从webhook中的短代码(而不是电话号码)接收Twilio消息

替换字符串中的多个重叠子字符串

当使用keras.utils.Image_dataset_from_directory仅加载测试数据集时,结果不同

Gekko:Spring-Mass系统的参数识别

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

无法使用requests或Selenium抓取一个href链接

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

用渐近模计算含符号的矩阵乘法

使用Python和文件进行模糊输出

在极中解析带有数字和SI前缀的字符串

如何检测鼠标/键盘的空闲时间,而不是其他输入设备?

Python类型提示:对于一个可以迭代的变量,我应该使用什么?

有没有办法在不先将文件写入内存的情况下做到这一点?

如何在Airflow执行日期中保留日期并将时间转换为00:00

提取最内层嵌套链接

EST格式的Azure数据库笔记本中的当前时间戳

如何在Python中实现高效地支持字典和堆操作的缓存?

有什么方法可以在不对多索引DataFrame的列进行排序的情况下避免词法排序警告吗?