GOOGLE ADS

вторник, 12 апреля 2022 г.

Почему self в классе всегда имеет предыдущие данные?

я новичок в python, и сегодня у меня была эта проблема:

скажем, у меня есть этот код, включающий два класса с именами: sliceи mat:


class slice():
def __init__(self, var:int) -> None:
self.__var = var
@property
def var(self):
return self.__var
class mat():
__slices = []
def __init__(self,var:list) -> None:
self.__var = var
for i in var:
self.__slices.append(slice(i))
@property
def val(self):
return self.__var
@property
def slices(self):
return self.__slices
ori_data = [
[1,2,3,4],
[5,6,7,8]
]
list_mat = []
for i in ori_data:
list_mat.append(mat(i))
print(len(list_mat))
for i in list_mat:
print(i.slices)

выход:

2
[<__main__.slice object at 0x000002B20597E908>, <__main__.slice object at 0x000002B205957FC8>, <__main__.slice object at 0x000002B2059C7588>, <__main__.slice object at 0x000002B2059C76C8>, <__main__.slice object at 0x000002B2059C7508>, <__main__.slice object at 0x000002B2059D3708>, <__main__.slice object at 0x000002B2059D37C8>, <__main__.slice object at 0x000002B2059D3808>]
[<__main__.slice object at 0x000002B20597E908>, <__main__.slice object at 0x000002B205957FC8>, <__main__.slice object at 0x000002B2059C7588>, <__main__.slice object at 0x000002B2059C76C8>, <__main__.slice object at 0x000002B2059C7508>, <__main__.slice object at 0x000002B2059D3708>, <__main__.slice object at 0x000002B2059D37C8>, <__main__.slice object at 0x000002B2059D3808>]

Я думал, что: list_matбудет 2 матовых объекта (что верно на выходе print(len(list_mat)))

И я думал, что у каждого matобъекта list_matбудут 4 sliceобъекты, и varдля каждого объекта sliceбудет 1 2 3 4и 5 6 7 8для каждого объекта mat.

Но когда дело дошло до фактического matобъекта в памяти list_mat, у всех matбыли 8 sliceобъекты, и у них были точно такие же 8 sliceобъекты в памяти.

Когда я отлаживал, я обнаружил, что когда я создал второй matобъект, в __init__нем selfуже было предыдущее значение (которое было slicesсоздано для первого mat). Так что, когда я передал второй список 5 6 7 8для конструктора, он просто добавил бы другие 4 sliceобъекты для второго mat, что дало бы мне результат 8 sliceобъектов.

Другое дело, когда matсоздавалась вторая, то __sliceв первой она matпревращалась __sliceво вторую mat! На самом деле, когда я проверил функцию при отладке, я __init__обнаружил, что адрес второго объекта был адресом первого объекта, который уже был создан.matselfmat

Должно быть что-то deepcopy, что я пропустил.

Итак, подводя итог:

1: во время цикла for selfобъект для matкласса всегда имеет предыдущие данные, оставшиеся после создания первого matобъекта.

2: во время цикла for, как я могу выполнить глубокое копирование и создать совершенно новый объект со всем, что было создано в памяти?

Любой совет поможет!

дайте мне знать, если вы не понимаете мой вопрос!

Пожелания!


Решение проблемы

@jasonharper был прав.....

class mat():
__slices = []

Этот код создает переменную CLASS LEVEL, которая используется всеми экземплярами класса. Это полезно, например, если вы хотите иметь object_countпеременную, которую вы увеличиваете при создании объекта и уменьшаете при уничтожении. Но в вашем случае вы хотите, чтобы каждый matобъект имел свой собственный __slices, поэтому вы хотите определить эту переменную внутри __init__():

 def __init__(self,var:list) -> None:
self.__var = var
self.__slices = []

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...