【问题标题】:Abstract class, which is subclass of something else抽象类,它是其他东西的子类
【发布时间】:2017-01-15 09:25:47
【问题描述】:

根据Python 中的一些recepies 来定义Abstract class 我们应该声明它是这样的abcmeta:

class BaseStrategy(metaclass=ABCMeta):

但是如果这个类已经是其他类的子类呢?

class BaseStrategy(bt.Strategy):

改用其他选项(interfacesexception 在基类中)?

注意我试过了:

class BaseStrategy(bt.Strategy, metaclass=ABCMeta):

有了这样的回溯:

Traceback (most recent call last):
  File "D:/Projects/trading-bot/main/lab/backtrader/netflix.py", line 13, in <module>
    from main.lab.strategy import RSISimple, RSIBuySell, SMACross, SMA_RSI, HolyGrail, MACD_ADX, BBands
  File "D:\Projects\trading-bot\main\lab\strategy\__init__.py", line 1, in <module>
    from .rsi_simple import *
  File "D:\Projects\trading-bot\main\lab\strategy\rsi_simple.py", line 3, in <module>
    from main.lab.strategy.base_strategy import BaseStrategy
  File "D:\Projects\trading-bot\main\lab\strategy\base_strategy.py", line 6, in <module>
    class BaseStrategy(bt.Strategy, metaclass=ABCMeta):
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

bt.Strategy 也可能使用抽象类。

【问题讨论】:

标签: python inheritance abstract-class


【解决方案1】:

错误消息告诉您,您的基类已经有一个元类,它不是您的元类的超类。 Python 要求 issubclass(B, A) 暗示 issubclass(type(B), type(A))

你有

class AMeta(type): pass
class A(metaclass=AMeta): pass
class BMeta(type): pass
class B(A, metaclass=BMeta): pass

这是无效的,因为BMeta (type(B)) 不是AMeta (type(A)) 的子类。您可以通过声明派生元类来修复它:

class BMeta(AMeta): pass
# or even
class BMeta(type(A)): pass

class B(A, metaclass=BMeta): pass

在您的具体情况下,它看起来像这样:

class BaseStrategyMeta(ABCMeta, type(bt.Strategy)): pass
class BaseStrategy(bt.Strategy, metaclass=BaseStrategyMeta): pass

【讨论】:

  • 已编辑以解决实际问题。
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 2023-03-14
  • 2014-02-08
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多