Хранить экземпляр класса A в экземпляре класса B

Вы должны сделать это так, как вы описали. MongoDB является нереляционной базой данных и не поддерживает объединения.

1
задан FredMaster 17 January 2019 в 14:11
поделиться

2 ответа

1111 Это не то, как должно работать наследование классов. Вы хотите наследовать что-то, только если дочерний класс собирается использовать достаточное количество атрибутов / методов в родительском классе. Если дочерний класс имеет заметно отличающуюся структуру, он должен быть собственным классом.

В любом случае, как упомянуто @jasonharper, в какой-то момент вам нужно будет указать направление, к которому относится экземпляр Variable, к какому экземпляру Model, так что вы, скорее всего, получите что-то вроде этого:

varA = Variable(mdl, ...)
# or this
mdl.varA = Variable(...)

При первом способе вы сохранили бы метод в своем классе Variable:

class Foo:
    def __init__(self):
        self.vars = []

class Bar:
    def __init__(self, foo_instance, **kwargs):
        foo_instance.vars.append(self)

f = Foo()
b = Bar(f, hello='hey')
f.vars
# [<__main__.Bar object at 0x03F6B4B0>]

Со вторым способом вы можете добавить Variable экземпляров в list каждый раз, когда он добавляется:

class Foo:
    def __init__(self):
        self.vars = []
    def __setattr__(self, name, val):
        self.__dict__.update({name: val})
        if not name == 'vars':  # to prevent a recursive loop
            self.vars.append(val)

f = Foo()
f.vars
# []

f.a = 'bar'
f.vars
# ['bar']

Конечно, проще было бы просто смотреть прямо в __dict__ каждый раз, когда вы хотите vars: [1115 ]

class Bar:
    @property
    def vars(self):
        # Or you can return .items() if you want both the name and the value
        return list(self.__dict__.values())

b = Bar()
b.a = 'hello'
b.vars
# ['hello']

Оба они будут работать одинаково, даже если вы присвоили атрибуты своим собственным экземплярам класса.

0
ответ дан Idlehands 17 January 2019 в 14:11
поделиться

Вы можете использовать super () для этого и передать экземпляр родительскому элементу

class Model():
    vars = []

    def __init__(self, other=None):
        if other:
            self.vars.append(other)


class Variable(Model):
    def __init__(self, a):
        self.a = a
        super().__init__(self)


mdl = Model()
varA = Variable(3)
varB = Variable(4)
print(mdl.vars)
0
ответ дан Vinay Bharadhwaj 17 January 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: