Понимание инициализации класса Python

1

Предположим, что у меня есть два класса:

class A():
    pass

class B():
    pass

У меня есть еще один класс

class C(object):
    def __init__(self, cond):
        if cond ==True:
           # class C initialize with class A
        else:
           # class C initialize with class B

Если я наследую от A или B, эта реализация возможна?

  • 2
    Чего ты пытаешься достичь? Как вы написали свой код, класс C не имеет отношения ни к A ни к B
  • 1
    Вы также забыли два подчеркивания; это должно быть __init__ .
Показать ещё 1 комментарий
Теги:
superclass

4 ответа

4
Лучший ответ

Если вы хотите установить класс, используйте переменную __class__.

class C(object):
    def __init__(self, cond):
        if cond ==True:
           self.__class__ = A
        else:
           self.__class__ = B
        self.__class__.__init__(self)
  • 0
    хорошее решение .. спасибо
  • 2
    Тьфу! Нет! Валовой! Не делай этого!
3

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

То, что вы пытаетесь сделать, может быть своего рода шаблоном factory:

def something_useful(cond):
    if cond:
        return A()
    else:
        return B()

myobj = something_useful(cond)

или, возможно, вам требуется агрегация:

class C(object):
    def __init__(self, something_useful):
        # store something_useful because you want to use it later
        self.something = something_useful

# let C use either A or B - then A and B really should inherit from a common base
if cond:
    myobj = C(A())
else:
    myobj = C(B())
  • 0
    Да, вы можете просто переименовать something_useful полезное в C и это решение для вставки.
1

Вы хотите сделать что-то вроде mix- в зависимости от значения cond?

Если да, попробуйте

class C(object):
    def __init(self, cond):
        if cond ==True:
           self.__bases__ += A
        else:
           self.__bases__ += B

Я не уверен на 100%, что это возможно, потому что, возможно, оно работает только C. основы + = A. Если это невозможно, то то, что вы пытаетесь сделать, вероятно, невозможно. C должен либо наследовать от A, либо от B.

  • 0
    AttributeError: объект «C» не имеет атрибута «базы» является и не работают
1

Пока я не буду так жесток, как Йохен, я скажу, что вы, вероятно, ошибаетесь. Даже если это возможно, вам намного лучше использовать множественное наследование и иметь AC и класс BC.

Например:

class A():
    pass

class B():
    pass

class C():
    #do something unique which makes this a C
    pass

#I believe that this works as is?
class AC(A,C):
    pass

class BC(B,C):
    pass

Таким образом, вы можете просто вызвать

def get_a_c(cond):
    if cond == True:
       return AC()
    return BC()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню