Класс расширения Cython __getattr__ не выполняет то же поведение с помощью счетчика класса python - PullRequest
0 голосов
/ 09 марта 2020

Изменить: проблема сложнее, чем первый вопрос, который я задал, поэтому я удалил все и заново отредактировал вопрос.

Я попытался создать класс в python, работает следующий код: Из моего файла test_l oop .pyd

class mockClass:
    def __init__(self,val):
        self._val = val
    def __getattr__(self,attrName):
        print('Getattr:',attrName)
        print('This work on python:',self.__dict__)
        try:
            return self.__dict__[attrName]
        except:
            raise AttributeError("Unknow ",attrName)
    def __add__(self,val):
        return mockClass(self._val+val)
    def __str__(self):
        return str(self._val)
def test_func():
    print('In test func')
    myList = [1,2,3]
    for ii,item in enumerate(myList):
        if (ii==0):
            out = mockClass(item)
        else:
            print('Add:',item)
            out += item

    return out

И модуль работает, мой файл test.py:

import test_loop
a = test_loop.test_func()
print(a)


Но когда я изменяю класс python на класс Cython Я застрял в рекурсивном l oop: getattr (я тоже пытался getattribute ) застряли, потому что он пытается найти dict , что опять же , требуется функция getattr .

cdef class mockClass:
    cdef int _val
    def __init__(self,val):
        self._val = val
    def __getattr__(self,attrName):
        print('Getattr:',attrName)
        print('This work on python:',self.__dict__)
        try:
            return self.__dict__[attrName]
        except:
            raise AttributeError("Unknow ",attrName)
    def __add__(self,val):
        return mockClass(self._val+val)
    def __str__(self):
        return str(self._val)

Я не могу найти функциональный getattr пример класса расширения Cython.

1 Ответ

0 голосов
/ 09 марта 2020

Почему бы вам не использовать встроенную функцию суммы?

mySym = sum(myList)
...