gpt4 book ai didi

python - 仅在特定情况下、对于特定子类具有强制属性/变量

转载 作者:行者123 更新时间:2023-12-01 09:15:50 24 4
gpt4 key购买 nike

我有一个带有“强制”属性的抽象类:

class PMixin(ABC):

@property
@abstractmethod
def progressbar_step(self):
raise NotImplementedError

仅在特定情况下才可能具有强制属性,而不适用于所有子类。

我使用多重继承,所以如果类A

class A(PMixin, B)

也继承自B,不是强制性的,否则是强制性的。

如果 A 不是 B 的子类,则它继承所有 PMixin。

如果它也继承自B,则progressbar_step不是必需的。

我可以声明:progressbar_step=None,在PMixin仅当不是从 B 继承时才覆盖,并解决问题,例如

class PMixin(ABC):
progressbar_step = None

class A(PMixin)
progressbar_step = 5

class A2(PMixin, B)
....

但我想得到一个警告,什么情况下才有值,例如示例A;这只是一种编码“安全”机制

最佳答案

这是使用 __init__subclass__ 的解决方案,在 Python 3.6 中提供。每当 PMixin 被子类化时都会调用它,我们可以使用它从符合我们条件的子类中删除 abstractmethod

from abc import ABC, abstractmethod

class B:
pass

class PMixin(ABC):
@property
@abstractmethod
def progressbar_step(self):
raise NotImplementedError
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
if issubclass(cls, B):
print('is subclass')
print(cls.progressbar_step)
cls.progressbar_step = None

class A(PMixin): # Will raise error
pass

class C(PMixin, B): # No error
pass

如果您希望在子类化 PMixin 时出现警告,而不是在尝试实例化该子类的对象时出现警告,则可以在 cls.progressbar_step.__isabstractmethod__ 中检查 __init_subclass__ 并适本地发出警告。

关于python - 仅在特定情况下、对于特定子类具有强制属性/变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51265891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com