Интерфейсы и базовые классы представляют две разные формы отношений.
Наследование (базовые классы) представляет собой отношение «is-a». Например. собака или кошка - это «домашнее животное». Эта связь всегда представляет (единственную) цель класса (в сочетании с принципом «одной ответственности» »).
Интерфейсы, с другой стороны, представляют собой дополнительные функции класс. Я бы назвал это отношением «есть», например, «Foo
является одноразовым», следовательно, интерфейс IDisposable
в C #.
Есть два варианта:
Пример:
class A(object):
def a1(self):
""" This is an instance method. """
print "Hello from an instance of A"
@classmethod
def a2(cls):
""" This a classmethod. """
print "Hello from class A"
class B(object):
def b1(self):
print A().a1() # => prints 'Hello from an instance of A'
print A.a2() # => 'Hello from class A'
Или используйте наследование, если уместно:
class A(object):
def a1(self):
print "Hello from Superclass"
class B(A):
pass
B().a1() # => prints 'Hello from Superclass'
вы создаете класс, от которого наследуются оба класса.
Существует множественное наследование, поэтому, если у них уже есть родитель, это не проблема.
class master ():
def stuff (self):
pass
class first (master):
pass
class second (master):
pass
ichi=first()
ni=second()
ichi.stuff()
ni.stuff()
Существует несколько подходов:
В следующих примерах каждый из них используется для совместного использования функции который печатает член.
Наследование
class Common(object):
def __init__(self,x):
self.x = x
def sharedMethod(self):
print self.x
class Alpha(Common):
def __init__(self):
Common.__init__(self,"Alpha")
class Bravo(Common):
def __init__(self):
Common.__init__(self,"Bravo")
Делегирование
class Common(object):
def __init__(self,x):
self.x = x
def sharedMethod(self):
print self.x
class Alpha(object):
def __init__(self):
self.common = Common("Alpha")
def sharedMethod(self):
self.common.sharedMethod()
class Bravo(object):
def __init__(self):
self.common = Common("Bravo")
def sharedMethod(self):
self.common.sharedMethod()
Супер-скрытое делегирование
Это решение основано на том факте, что в функциях-членах Python нет ничего особенного; вы можете использовать любую функцию или вызываемый объект, если первый параметр интерпретируется как экземпляр класса.
def commonPrint(self):
print self.x
class Alpha(object):
def __init__(self):
self.x = "Alpha"
sharedMethod = commonPrint
class Bravo(object):
def __init__(self):
self.x = "Bravo"
sharedMethod = commonPrint
Или похожий хитрый способ достижения делегирования - использовать вызываемый объект:
class Printable(object):
def __init__(self,x):
self.x = x
def __call__(self):
print self.x
class Alpha(object):
def __init__(self):
self.sharedMethod = Printable("Alpha")
class Bravo(object):
def __init__(self):
self.sharedMethod = Printable("Bravo")