Проблемы, расширяющие встроенные типы python дополнительными атрибутами и методами. - PullRequest
0 голосов
/ 19 апреля 2020

В настоящее время я создаю контейнер для данных встроенных типов 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(), чтобы проверить тип, создать контейнер и инициализировать в работающем методе. Но есть ли подход «один размер подходит всем»?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

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

0 голосов
/ 20 апреля 2020

Большинство ваших проблем связано с тем, что type(...) не возвращает родительский класс, а <class 'type'>. Поэтому, когда вы делаете class container (dataType), вы создаете класс типа ... type.

# example
>>> type(str) #when you expect str, it returns ...
<class 'type'>

Чтобы решить эту проблему, измените dataType = type(data) на dataType = data.__class__.

# second example
>>> "my data is str".__class__
<class 'str'>

РЕДАКТИРОВАТЬ: Когда вы делаете super().__init__() и получаете ошибку TypeError: object.__init__() takes exactly one argument (the instance to initialize), это связано с тем, что когда вы создаете класс с функцией __init__, это всегда __init__(self, ...). В вашем случае super() возвращает класс object, а функция object __init__ определяется как __init__(self) без дополнительных аргументов. Так что ожидается один аргумент, self. Но вы не пропустите это, и это вызывает ошибку. Я надеюсь, вы понимаете, о чем я.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...