Как создать новые подклассы, добавив один и тот же метод к нескольким классам - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть 5 классов, которые являются подклассами родительского класса.Я хочу определить новые подклассы для каждого из этих классов, добавив идентичный метод для каждого из них.Есть ли способ сделать это динамически?У него есть имя в терминологии ООП?

Ниже new_method одинаково для всех случаев, поэтому я бы предпочел повториться.

class A(MySuperClass)
class B(MySuperClass)
class C(MySuperClass)
class D(MySuperClass)

class AAA(A):

    def new_method():
        ...

class BBB(B):

    def new_method():
        ...

class CCC(C):

    def new_method():
        ...

class DDD(D):

    def new_method():
        ...

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Вы можете использовать type для динамического создания классов:

class Foo(object):
    def __init__(self):
        print("NOTHING")

def func(self):
    print("ARRRGH")

Bar = type('Bar', (Foo,), {"func": func})
Bar2 = type('Bar2', (Foo,), {"func": func})
Bar3 = ... # Put in loop if you like.

b = Bar() # This will print "NOTHING", Bar2, Bar3 works the same way.
b.func() # will print "ARRRGH"
0 голосов
/ 04 февраля 2019

Помимо множественного наследования, вы также можете использовать декоратор, если он более удобен для вашего кода:

def add_new_method(cls):
    def new_method(self, ...):
        pass
    cls.new_method = new_method
    return cls

@add_new_method
class AAA(A):
    ...

Однако, если вам не обязательно нужен новый подкласс AAA, а просто нужнодобавить new_method к A, B, C, D из суперкласса, тогда это так же просто, как:

def new_method(self, ...):
    pass

A.new_method = new_method

Еще лучше.Если MySuperClass можно изменить, вы можете просто сделать:

MySuperClass.new_method = new_method

# A, B, C and D will all have new_method automatically.
0 голосов
/ 04 февраля 2019

Вы можете решить повторение, создав новый класс, содержащий ваш new_method следующим образом:

class A(MySuperClass)
class B(MySuperClass)
class C(MySuperClass)
class D(MySuperClass)

class Mixin():
    def new_method():
        pass

class AAA(A, Mixin):
    pass

Это называется мульти-наследование.здесь можно рассматривать наследование как механизм специализации, а также совместное использование кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...