Добавление наследования классу программно в Python? - PullRequest
3 голосов
/ 06 мая 2010

Могу ли я заставить класс наследовать класс "в программе" в Python?

вот что у меня есть:

base = list(cls.__bases__)
base.insert(0, ClassToAdd )
base = tuple( base )
cls = type( cls.__name__, base, dict(cls.__dict__) )

Ответы [ 3 ]

9 голосов
/ 07 мая 2010

Вот пример, использующий предложение Грега Хьюгилла:

class Foo(object):
    def beep(self):
        print('Hi')

class Bar(object):
    x=1  

bar=Bar()
# bar.beep()
# AttributeError: 'Bar' object has no attribute 'beep'

Bar=type('Bar',(Foo,object),Bar.__dict__.copy())
bar.__class__=Bar
bar.beep()
# Hi
4 голосов
/ 06 мая 2010

Да, встроенная функция type() имеет форму с тремя аргументами, которая может сделать это:

тип ( имя , основания , dict )

Возвращает объект нового типа. По сути, это динамическая форма оператора class. Строка name является именем класса и становится атрибутом __name__; кортеж base классифицирует базовые классы и становится атрибутом __bases__; а словарь dict является пространством имен, содержащим определения для тела класса, и становится атрибутом __dict__.

1 голос
/ 23 ноября 2011

Другой вариант заключается не в динамическом изменении иерархии классов, а в украшении экземпляров объектов новыми функциональными возможностями. Как правило, это проще и легче отлаживать, потому что вы изменяете только те объекты, в которых ваш код находится в элементах управления, без необходимости сквозного изменения всей иерархии классов.

def extend_object(obj):
    class ExtensionClass(obj.__class__):
        def new_functionality(self):
             print "here"
    obj.__class__ = ExtensionClass

b = Foo()
extend_object(b)
b.new_functionality()
#prints "here"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...