Атрибут Python, который содержит другие существующие атрибуты в списке - PullRequest
0 голосов
/ 28 мая 2018

В настоящее время я работаю над проектом python-sqlite, и я новичок в обоих.

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

Мне нужна эта структура, чтобы иметь возможность вызывать эти атрибуты вместе, выполнять итерации по ним, но я хочу иметь возможность вызыватьих тоже отдельно.

Сначала я попытался создать этот атрибут списка внутри метода __init__, после остальных объявлений.Однако, когда я создаю экземпляр и изменяю начальное значение одного из атрибутов, атрибут в списке не обновляется.

Затем я попытался создать этот же атрибут списка внутри другого метода класса,вместо того, чтобы внутри init и вызывать его из моего кода, и он сделал то, что хотел.

Почему другой подход дает разные результаты?

Здеськод в обоих случаях:

Дело № 1

class Tools():
    def __init__(self):
        self.name = "defaultname"
        self.manufacturer = "defaultmanuf"
        self.tooldetails = [self.name, self.manufacturer]

    def get_details(self):
        return self.tooldetails

Дело № 2

class Tools():
    def __init__(self):
        self.name = "defaultname"
        self.manufacturer = "defaultmanuf"

    def _set_detail_list(self):
        self.tooldetails = [self.name, self.manufacturer]

    def get_details(self):
        _set_detail_list()
        return self.tooldetails

Акогда я создаю экземпляр:

tool1 = Tools()
tool1.name = 'abc'
tool1.get_details()

Первый случай дает мне ["defaultname", "defaultmanuf"], а второй дает мне ["abc","defaultmanuf"].

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

dir() и другие подобные функции или магические методы могут дать мне то, что я хочу, но я думаю, что они недостаточно гибки, если выхочу много разных списков с разными наборами атрибутов.К сожалению, интроспекция не очень хорошо работает с командами в формате строки sqlite ..

Плюс мне любопытно, как работает python, что я считаю очень важным ..

Спасибо !!

1 Ответ

0 голосов
/ 28 мая 2018

Case # 1

Когда ваш список создается в __init__, он содержит указатели на 2 строки.Но связь между name и tooldetails безвозвратно разорвана после создания вашего списка.Если вы обновите name, tooldetails не будет динамически обновляться, если вы не скажете Python явно обновлять tooldetails новыми данными.

Случай № 2

Здесь вы явно указываете Python восстановить tooldetails с помощью метода _set_detail_list, который вызывается в get_details.Вы обновляете name и , а затем указываете Python перестроить список tooldetails.Поэтому, если вы обновите name, а затем get_details, ваш список будет обновлен.

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