Не создаётся отдельный объект python? Или я неправильно понял ООП?

У меня есть класс GameObject

class GameObject:
scene = None
_components = dict()
childs = list()

def __init__(self):
    pass

def AddComponent(self, component: Component):
    for comp in self._components.values():
        if comp.id == component.id:
            return Error(1)
    component.parent = self
    self._components[component.id] = component

def GetComponent(self, _id: str):
    for id1, comp in self._components.items():
        if id1 == _id:
            return comp
    Error(2)

def isComponent(self,  _id: str):
    for id1, comp in self._components.items():
        if id1 == _id:
            return True
    return False

Объекту можно добавлять, убирать, и проверять наличие компонентов. Но при создании его список компонентов пуст.

Когда я пытаюсь выполнить такой код. Добавляю лишь одному объекту компонент Transform

gm = GameObject()
gm.AddComponent(Transform())

test_object = GameObject()

print(test_object.isComponent("transform"))

# Вывод: True

И в таком случае:

gm = GameObject()
gm.AddComponent(Transform())

test_object = GameObject()

print(test_object.GetComponent("transform"))
print(gm.GetComponent("transform"))

# Вывод:
# <Engine.Components.Transform.Transform object at 0x0000020843DB3B30>
# <Engine.Components.Transform.Transform object at 0x0000020843DB3B30>

Ответы (1 шт):

Автор решения: Алексей

В дополнение к комментарию @insolor укажу на важный момент: при создании общих полей надо учитывать их мутируемость:

class Sample():
    no_mutable = None
    lst_data = []
    dict_data = {}
    lst_data_init = []
    def __init__(self, value, item_data_init, **kwargs):
        self.value = value
        self.obj_dict = kwargs
        self.lst_data_init.append(item_data_init)

    def add_parametrs(self, no_mutable, item_lst_data, **kwargs):
        self.no_mutable = no_mutable
        self.lst_data.append(item_lst_data)
        self.dict_data.update(kwargs)

    def print_values(self):
        print(f"""
        no_mutable: {self.no_mutable}
        lst_data: {self.lst_data}
        dict_data: {self.dict_data}
        lst_data_init: {self.lst_data_init}
        ---
        value: {self.value}
        obj_dict: {self.obj_dict}
        """)

obj = Sample(111,'item_1', name='obj1')
obj.print_values()

obj2 = Sample(222, 'item_2', name='obj2')
obj2.print_values()

obj.add_parametrs(50, 5, key_dict='value_dict')

obj.print_values()
obj2.print_values()

Выведет:

        no_mutable: None
        lst_data: []
        dict_data: {}
        lst_data_init: ['item_1']
        ---
        value: 111
        obj_dict: {'name': 'obj1'}
        

        no_mutable: None
        lst_data: []
        dict_data: {}
        lst_data_init: ['item_1', 'item_2']
        ---
        value: 222
        obj_dict: {'name': 'obj2'}
        

        no_mutable: 50
        lst_data: [5]
        dict_data: {'key_dict': 'value_dict'}
        lst_data_init: ['item_1', 'item_2']
        ---
        value: 111
        obj_dict: {'name': 'obj1'}
        

        no_mutable: None
        lst_data: [5]
        dict_data: {'key_dict': 'value_dict'}
        lst_data_init: ['item_1', 'item_2']
        ---
        value: 222
        obj_dict: {'name': 'obj2'}

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

→ Ссылка