У меня есть базовый класс, где я хочу обрабатывать __add__()
и хочу поддерживать, когда __add__
с двумя экземплярами подкласса - это методы обоих подклассов в результирующем экземпляре ,python: множественное наследование и __add __() в базовом классе
import copy
class Base(dict):
def __init__(self, **data):
self.update(data)
def __add__(self, other):
result = copy.deepcopy(self)
result.update(other)
# how do I now join the methods?
return result
class A(Base):
def a(self):
print "test a"
class B(Base):
def b(self):
print "test b"
if __name__ == '__main__':
a = A(a=1, b=2)
b = B(c=1)
c = a + b
c.b() # should work
c.a() # should work
Редактировать: Чтобы быть более конкретным: у меня есть класс Hosts
, который содержит dict(host01=.., host02=..)
(отсюда и подклассов из dict
) - это предлагает некоторые базовые методы, такие как run_ssh_commmand_on_all_hosts()
Сейчас я у вас есть подкласс HostsLoadbalancer
, который содержит некоторые специальные методы, такие как drain()
, и у меня есть класс HostsNagios
, который содержит некоторые специфичные для nagios методы.
Что я делаю то, что-то вроде:
nagios_hosts = nagios.gethosts()
lb_hosts = loadbalancer.gethosts()
hosts = nagios_hosts + lb_hosts
hosts.run_ssh_command_on_all_hosts('uname')
hosts.drain() # method of HostsLoadbalancer - drains just the loadbalancer-hosts
hosts.acknoledge_downtime() # method of NagiosHosts - does this just for the nagios hosts, is overlapping
Что является лучшим решением для этой задачи?
Я думаю, что можно как-то «копировать все методы» - как это: для й в реже (другой): SetAttr (я, х, GetAttr (другой, х))
Я на правах отслеживать? Или я должен использовать абстрактные базовые классы?
хороший, не знал о 'type ('A_B', (A, B), {})' works - это очень много выглядит, что я искал - внутренне мы все еще обсуждаем, верно, хотя ;-) – hansaplast