Понимание инициализации класса Python - PullRequest
1 голос
/ 03 июня 2011

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

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, возможна ли эта реализация?

Ответы [ 4 ]

4 голосов
/ 03 июня 2011

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

class C(object):
    def __init__(self, cond):
        if cond ==True:
           self.__class__ = A
        else:
           self.__class__ = B
        self.__class__.__init__(self)
3 голосов
/ 03 июня 2011

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

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

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())
1 голос
/ 03 июня 2011

Хотя я не буду таким суровым, как Йохен, я скажу, что вы, вероятно, выбрали неправильный подход. Даже если это возможно, вам гораздо лучше использовать множественное наследование и иметь 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()
1 голос
/ 03 июня 2011

Ты имеешь в виду, что ты хочешь сделать что-то вроде смешивания в зависимости от значения cond?

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

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

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

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