Cython类执行同类Cython类的列表

2024-10-01 19:15:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Cython中定义了一个泛型类Rule,它需要一个cdef方法initialize。我创建了一个类,该类本身定义为Rule,但它执行规则列表的initialize方法:

%%cython

cdef class Rule:
    cdef initialize(self, const int i):
        pass


cdef class Print(Rule):
    cdef int number
    
    def __init__(self, int number):
        self.number = number
    
    cdef initialize(self, const int i):
        print(self.number, i)


cdef class ChainRule(Rule):
    cdef list rules
    cdef int number_of_rules, j
    
    def __init__(self, rules):
        self.rules = rules
        self.number_of_rules = len(rules)
    
    cdef initialize(self, const int i):
        for j in range(self.number_of_rules):
            self.rules[j].initialize(i)


def run(Rule rule, const int i):
    rule.initialize(i)

当̀run`将打印作为输入时,以下代码起作用:

rule1 = Print(1)
rule2 = Print(2)

run(rule1, 100)

但是在内部调用规则的ChainRule类不起作用:

chain_rule = ChainRule([rule1, rule2])
run(chain_rule, 100)

错误消息:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/tmp/ipykernel_12612/3538048733.py in <module>
      4 chain_rule = ChainRule([rule1, rule2])
      5 
----> 6 run(chain_rule, 100)

_cython_magic_d892e8623ea7126dd1dda2c25ea23c19.pyx in _cython_magic_d892e8623ea7126dd1dda2c25ea23c19.run()

_cython_magic_d892e8623ea7126dd1dda2c25ea23c19.pyx in _cython_magic_d892e8623ea7126dd1dda2c25ea23c19.ChainRule.initialize()

AttributeError: '_cython_magic_d892e8623ea7126dd1dda2c25ea23c19.Pri' object has no attribute 'initialize'

为什么会失败?我怎样才能让它工作

多谢各位

编辑,工作解决方案:

cdef class ChainRule(Rule):
    cdef list rules
    cdef int number_of_rules, j
    
    def __init__(self, rules):
        self.rules = rules
        self.number_of_rules = len(rules)
    
    cdef initialize(self, const int i):
        cdef Rule rule
        for j in range(self.number_of_rules):
            rule = self.rules[j]
            rule.initialize(i)

Tags: ofruninselfnumbermagicrulecython

热门问题