Класс Event
реализует функции copyFrom(self, event)
и copy(self)
.Реализация обоих методов представляет собой простой готовый торт.
class Event(object):
def __init__(self, a, b):
self.a = a
self.b = b
def copyFrom(self, event):
self.a = event.a
self.b = event.b
def copy(self):
return Event(self.a, self.b)
Теперь подкласс MouseEvent
хочет переопределить оба из них.Первый метод, copyFrom(self, event)
, может быть реализован путем вызова super -метода.
class MouseEvent(Event):
def __init__(self, a, b, c, d):
super(Event, self).__init__(a, b)
self.c = c
self.d = d
def copyFrom(self, event):
super(Event, self).copyFrom(event)
self.c = event.c
self.d = event.d
Но как насчет copy(self)
?Конечно, просто создать новый объект не сложно.
# ...
def copy(self):
return MouseEvent(self.a, self.b, self.c, self.d)
Но что, если класс Event
обладает некоторыми закрытыми атрибутами?Человек, который хочет подкласс этого, не хочет заботиться о них!
class Event(object):
def __init__(self, a, b):
self.a = a
self.b = b
self._aab = fancyFunction(a, b)
def doStuff(self, c):
self._aab <<= c * 2
def copyFrom(self, event):
self.a = event.a
self.b = event.b
self._aab = event._aab
def copy(self):
e = Event(self.a, self.b)
e._aab = self._aab
return e
Эта реализация copy(self)
выглядит довольно грязной, как и переопределенная реализация из MouseEvent
.
class MouseEvent(Event):
# ...
def copy(self):
e = MouseEvent(self.a, self.b, self.c, self.d)
e._aab = self._aab
return e
Как я могу реализовать простой, возможно, рекурсивный copy - Поведение в этом конкретном примере?