Я пытаюсь создать базовый базовый базовый класс в python, используя функциональность аннотаций нового типа в python 3 и поддержку дженериков.Python TypeError: объект «Generic» не подлежит расшифровке - как объявлять и запускать базовый базовый класс
У меня есть базовый класс и производный класс, определенный как таковой:
from abc import ABCMeta, abstractmethod
from typing import TypeVar, Generic, Iterator, List, Dict, Optional
_T = TypeVar('_T')
class FileReader(Generic(_T)):
__metaclass__ = ABCMeta
def __init__(self, filename: str, verbose: bool = False):
pass
_X = TypeVar('_X')
class EmploymentHistoryFileReader(FileReader[_X]):
def __init__(self, filename: str, verbose: bool = False):
FileReader.__init__(filename=filename, verbose=verbose)
И когда я пытаюсь создать экземпляр объекта типа EmploymentHistoryFileReader [EmploymentHistoryFileRow] я получаю:
File "/Users/simon.hughes/GitHub/analytics-py-careerpathing/careerpathing/data/employment_history_file_reader.py", line 38, in <module>
class EmploymentHistoryFileReader(FileReader[_X]):
TypeError: 'Generic' object is not subscriptable
У меня есть пробовал много разных вещей, таких как указание значения для общего параметра при объявлении подкласса или при создании экземпляра подкласса, и все они приводят к тому же сообщению об ошибке. В основной библиотеке много примеров типичных типов, которые работают правильно, поэтому я смущен тем, почему я получаю эти ошибки.
В дополнение к исправлению скобок вы не должны устанавливать '__metaclass__ = ABCMeta'. Это трижды неэффективно, потому что 1) они изменили синтаксис для указания метакласса в Python 3, 2), вы все равно не имеете абстрактных методов, и 3) ваш класс наследует метакласс «typing.GenericMeta» от «Generic [_T ] '. – user2357112
У меня есть абстрактные методы, я опускал их для краткости, поскольку они не влияли на проблему. Мне было интересно, нужно ли мне это, хотя я видел, что класс Generic был ABC, поэтому я его удалю. – Simon