Класс, содержащий список производных классов - PullRequest
0 голосов
/ 12 мая 2019

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

class base(object): 
    type   = []                  
    def __init__(self,arg1,arg2):
        self.m1 = arg1
        self.m2 = arg2

class derivedA(base):    # inherits from base
    type = 'A'  
    base.type.append('A')
    def value(self,arg):
        return arg*0.345

class derivedB(base):
    type   = 'B'
    base.type.append('B')
    def value(self,arg):
        return arg*0.186

Теперь предположим, что я хочу определить другой класс, который содержит список любых классов, производных от base как член:

class container(object):
    def __init__(self,dim=None,tp=None):
        assert dim>=0
        if dim==0:
            self.dim = 0
            self.lst = [ ]
            self.mlt = [ ] 
        else:
            assert tp!=None
            self.dim = dim
            self.lst = [base(0,0) for _ in range(dim)] # how to call generic constructor of class?
            self.mlt = [1.0] * dim

    def printVals(self,value):
        for d in self.lst:
            print(d.value(value))

Как бы я мог в общем случае вывести адекватный конструктор из типа tp, переданного в качестве аргумента?На самом деле, он только создает список base членов класса:

gg = container(10,derivedA.type)
gg.printVals(0.5) # 'base' object has no attribute 'value'

1 Ответ

1 голос
/ 13 мая 2019

У меня такое ощущение, что вы не совсем привыкли к тому факту, что классы являются объектами в Python. Вам не нужны строки в качестве заполнителей для классов. Вы можете просто проходить уроки напрямую.

Все эти вещи type бессмысленны. Пройдите уроки напрямую:

class Base(object): 
    def __init__(self, arg1, arg2):
        self.m1 = arg1
        self.m2 = arg2

class DerivedA(Base):
    def value(self, arg):
        return arg*0.345

class DerivedB(Base):
    def value(self, arg):
        return arg*0.186

class Container(object):
    def __init__(self, dim=None, tp=None):
        if dim is not None and dim < 0:
            raise ValueError('dim must be positive')
        if not dim:
            self.dim = 0
            self.lst = []
            self.mlt = [] 
        else:
            if tp is None:
                raise TypeError('tp must be provided if dim is provided')
            self.dim = dim
            self.lst = [tp(0, 0) for _ in range(dim)]
            self.mlt = [1.0] * dim

    def print_vals(self, value):
        for d in self.lst:
            print(d.value(value))

gg = Container(10, DerivedA)
gg.print_vals(0.5)

Обратите внимание на использование DerivedA вместо derivedA.type в вызове Container и вызов tp(0, 0) в конструкторе Container.

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