В настоящее время я создаю контейнер для данных встроенных типов python. Предоставленные данные имеют неизвестный встроенный тип. Поскольку встроенные типы не могут иметь свои атрибуты и методы, добавленные / измененные.
Однако у меня есть проблемы с созданием экземпляра унаследованного класса.
ПРИМЕЧАНИЕ. Следующий код будет внутри другой класс
С этим кодом:
def createContainer(data):
dataType = type(data)
class container(dataType):
def __init__(self, data):
super().__init__(data)
## Instantiate the container attributes here
return container(data)
Из протестированных мной типов данные этих типов были созданы правильно:
- Список
- Словарь
- Установить
- Bytearray
Однако, это оставило много типов, которые не будут работать, это приведет к ошибке:
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
Вопрос 1 - почему эта ошибка возникает, когда я передаю только один аргумент независимо от типа данных.
При попытке выполнить этот маршрут:
class container(dataType):
def __init__(self, data):
super().__init__()
## Instantiate the container attributes here
Из протестированных типов данные этих типов были правильно сохранены:
- String
- Integer
- Float
- Tuple
- Сложный
- Байт
- Frozenset
Другие типы (список, словарь, набор, bytearray) были созданы, но были пустыми и не содержали данных, которые я передал.
Вопрос 2a - Я не передаю никаких аргументов в конструктор супер, так почему вышеупомянутые типы инициализируются должным образом, когда нет данных? прошло?
Вопрос 2b - когда я заменяю super().__init__()
на dataType.__init__(data)
, я получаю те же результаты. Я предполагаю, что они делают то же самое в этом случае, но как это возможно, если мы не предоставили аргумент в super().__init__()
Вопрос 3. Из того, что я вижу, метод 1 работает только с изменчивые типы. В то время как метод 2 работает только с неизменяемыми типами. Но как это повлияет на способ создания этих типов?
Последний вопрос - я знаю, что могу написать условные выражения в конструкторе, используя isinstance()
, чтобы проверить тип, создать контейнер и инициализировать в работающем методе. Но есть ли подход «один размер подходит всем»?