Два разных объекта, созданные с использованием класса, совместно используют одну и ту же память - PullRequest
0 голосов
/ 05 октября 2019

Я работаю над скриптом Python, выполняю функцию, которая создает экземпляр объекта из класса. Запуск этой функции дважды (предположительно, создание двух объектов) создает две переменные, которые указывают на одну и ту же область памяти, фактически делая меня только одним объектом. Это было бы понятно, если бы атрибуты объекта были одинаковыми оба раза, но это не так. Это означает, что атрибуты первого экземпляра перезаписываются вторым.

Я пытался сделать глубокую копию, чтобы исправить это.

x = deepcopy(create_my_object(123))
y = deepcopy(create_my_object('abc')) 

x и y по-прежнему указывают ната же ячейка памятиЭто означает, что атрибут «123» объекта x перезаписывается на «abc». Мне нужны два объекта с каждым из этих атрибутов.

Класс:

class Sq:
    def __init__(self, source, queries):
        Sq.datetime_created = datetime.datetime.now()
        Sq.source = source
        Sq.queries = queries
        Sq.count = len(queries)
        Sq.filtered = False 

Итак, подведем итог: вызов этого класса с разными наборами аргументов не создает объекты в разных местах, я простов итоге получим один объект с атрибутами самого последнего экземпляра.

Заранее спасибо - я и мои коллеги в тупике!

Редактировать: Функция создания объекта выглядит следующим образом:

def news(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')
    result = soup.find_all(class_='top-story__title')
    return Sq(url, result)

1 Ответ

1 голос
/ 05 октября 2019

В методе Sq.__init__ вы устанавливаете значение class переменных, а не переменных экземпляра. Эти значения являются общими для всех экземпляров класса и перезаписываются во всех экземплярах при изменении в любом из них. См. здесь для описания класса против переменных экземпляра.

Измените каждую строку, например, self.datetime_created = datetime.datetime.now() и т. Д.

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