Я написал класс, как показано ниже. Я хочу добавить атрибут 'parent' в мой базовый класс Node. Мне было интересно, может ли кто-нибудь показать мне, как правильно это сделать. Мне дали указания о том, как это сделать, но я не совсем уверен, как написать синтаксис. Вот предлагаемый способ сделать это ...python parent child relationship class
вообще я бы скрыть родительский атрибут позади свойства так, когда своего набора, то дети массив предыдущего родителя может быть изменен так , если вы говорите н. родитель = х, он на самом деле удалить узел п от его родительского и установить значение родительского
class Node(object):
def __init__(self, name, attributes, children):
self.name = name
self.attributes = attributes if attributes is not None else {}
self.children = children if children is not None else []
class Camera(Node):
def __init__(self, name="", attributes=None, children=None, enabled=True):
super(Camera, self).__init__(name=name, attributes=attributes, children=children)
self.enabled = enabled
обновленный
import weakref
class Node(object):
_parent = None
def __init__(self, name, attributes, children, parent):
self.name = name
self.attributes = attributes if attributes is not None else {}
self.children = children if children is not None else []
self.parent = parent
for child in children:
child.parent = self
@property
def parent(self):
return self._parent() if self._parent is not None else None
@parent.setter
def parent(self, newparent):
oldparent = self.parent
if newparent is oldparent:
return
if oldparent is not None:
oldparent.children.remove(self)
if self not in newparent.children:
newparent.children.append(self)
self._parent = weakref.ref(newparent) if newparent is not None else None
class Camera(Node):
def __init__(self, name="", attributes=None, children=None, enabled=True, parent=None):
super(Camera, self).__init__(name=name, attributes=attributes, children=children, parent=parent)
self.enabled = enabled
Camera()
Замечание: Вероятно, лучше использовать 'weakref.ref' или' weakref.proxy' для хранения атрибута '_parent' (мы предполагаем, что' parent' является 'свойством', поэтому соглашение в этом случае обычно для обозначения «реального» атрибута с префиксом подчеркивания). В противном случае ваши деревья гарантируют создание эталонных циклов, поэтому они не будут очищены детерминистически (и память просочится, если какая-либо гайка отключает циклический gc, или любой объект цикла имеет 'class' с финализатором' __del__', [на Python 3.3 и ранее, циклический gc не может справиться с этим] (https://docs.python.org/3/whatsnew/3.4.html#whatsnew-pep-442)). – ShadowRanger
Что я надеялся сделать родителем камеры на другую камеру – JokerMartini