Не создаётся отдельный объект 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'}
Таким образом можно увидеть, что все, что если у Вас муттируемые поля в полях класса, то они будут изменяться везде.