Доступ к классу Python - PullRequest
0 голосов
/ 22 мая 2019

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

 def myList(list):

    def __repr__(self):
    return list.__repr__(self)

Так что, по сути, просто список. Но затем сразу после ввода в список ввода я хочу удвоить его значение. т.е.

когда я использую

 t = myList([1, 2, 3])
 print(t)

должно выдать [2, 4 ,6]

Теперь я знаю, как удвоить каждый элемент списка, например, я могу использовать

 l = [x * 2 for x in l]

но я не уверен, как получить доступ к члену объекта myList сразу после создания и удвоить их.

1 Ответ

5 голосов
/ 22 мая 2019

Вам необходимо переопределить __init__, чтобы выполнить преобразование ввода, прежде чем передать его до list __init__, например. с пониманием списка или генератором выражения:

class myList(list):
    def __init__(self, it=()):
        super().__init__([x * 2 for x in it])

    def __repr__(self):
        return list.__repr__(self)

Версия выражения генератора будет super().__init__(x * 2 for x in it); он избегает потенциально большого временного list, но обычно будет медленнее.

Примечание: вам вообще не нужно переопределять __repr__; вы наследуете его от list автоматически, так что вы можете просто опустить определение полностью. Переопределение имеет смысл, только если вы хотите отобразить в два раза, но сохранить исходные значения, в этом случае вы хотите:

class myList(list):
    def __repr__(self):
        return repr([x * 2 for x in self])

Редактировать : Поскольку операционная система запросила способ инициализации myList, затем удвоив значения, вы можете немедленно вызвать инициализатор list, а затем выполнить дублирование на myList впоследствии. myList все еще не полностью инициализируется до тех пор, пока не вернется __init__, и будет медленнее, но это отделяет базовую инициализацию list от удвоения:

class myList(list):
    def __init__(self, it=()):
        super().__init__(it)  # Perform list initialization with original values
        # Cycle through values and double each one
        for i, x in enumerate(self):
            self[i] = x * 2
...