Объект, не повторяемый в python, при создании сделал класс повторяемым для объектов - PullRequest
0 голосов
/ 15 октября 2019

Я делаю программу, в которой мне нужно перебирать каждую опцию в классе для выполнения действий над каждым объектом, для этого я создал класс IterRegistry, чтобы превратить метакласс моих объектов в итеративный, но по какой-то причине,это все еще не работает.

class IterRegistry(type):
    def __iter__(cls):
        return iter(cls._registry)


class TreeLine(object):
    __metaclass__ = IterRegistry
    _registry = []

    def __init__(self, earnings, buy_price):
        self._registry.append(self)
        self.earnings = earnings
        self.buy_prince = buy_price


TreeLine(0, 0)
TreeLine(0, 7)

for i in TreeLine:
    print(i)

Я просто получаю сообщение об ошибке: Файл "/Users/PycharmProjects/AISTUFF/venv/OSI@.py", строка 23, для i в TreeLine: TypeError: объект 'type' не повторяется

1 Ответ

1 голос
/ 15 октября 2019

Объявление метакласса класса следующим образом:

class TreeLine(object):
    __metaclass__ = IterRegistry

не работает в Python 3. Вместо этого метакласс объявляется так:

class TreeLine(metaclass=IterRegistry):
    ...

Синтаксис задокументирован здесь . Изменение было предложено в PEP3115 .

Обратите внимание, что форма __metaclass__ не является недопустимым синтаксисом, она просто не ведет себя как в Python 2.

>>> class M(type):pass
... 
>>> class C:
...     __metaclass__ = M
... 
>>> type(C)
<class 'type'>
>>> class D(metaclass=M):pass
... 
>>> type(D)
<class '__main__.M'>
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...