2017-01-15 3 views
0

Nach einigen recepies in Python definieren Abstractclass sollten wir erklären, dass es abcmeta wie folgt ist:Abstrakte Klasse, die Unterklasse von etwas anderem ist

class BaseStrategy(metaclass=ABCMeta): 

Was aber, wenn diese Klasse ist bereits aus anderen Klasse unterklassiert?

class BaseStrategy(bt.Strategy): 

Verwenden Sie andere Optionen (interfaces, exception in Basisklasse) statt?

Bitte beachte, dass ich versucht:

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

Mit einer solchen Zurückverfolgungs:

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 

Möglich, dass bt.Strategy zu abstrakten Klassen verwendet.

+0

gestellte auf 'Backtrader' (Bibliothek verwendet) Forum zu:

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

In Ihrem konkreten Fall ist es so aussehen würde https: // community.backtrader.com/topic/114/strategy-inheritance/6 –

Antwort

3

Die Fehlermeldung teilt Ihnen mit, dass Ihre Basisklasse bereits über eine Metaklasse verfügt, die keine Oberklasse Ihrer Metaklasse ist. Python erfordert, dass issubclass(B, A) bedeutet, dass issubclass(type(B), type(A)).

Du hast

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

, die ungültig ist, weil BMeta (type(B)) ist keine Unterklasse von AMeta (type(A)). Sie können das Problem beheben, indem Sie die abgeleitete Metaklasse erklärt:

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

Diese Idee wurde ohne Glück versucht. –

+0

Bearbeitet, um das tatsächliche Problem anzugehen. – emulbreh

+0

Danke! Es klappt. –

Verwandte Themen