вы, наверное, на самом деле не нужно, и это, вероятно, проблема XY, но те, случаются регулярно, когда вы изучаете язык. Вы должны знать, что вам, как правило, не нужно создавать огромные иерархии классов с Python, как вы делаете с некоторыми другими языками. Python использует «утиную печать» - если у класса есть метод, который вы хотите использовать, просто позвоните!
Также, к моменту, когда вызывается __init__
, экземпляр уже существует. Вы не можете (легко) изменить его для другого экземпляра в то время (хотя, действительно, все возможно).
если вы действительно хотите, чтобы иметь возможность создать экземпляр класса и получить то, что, по существу, экземпляры совершенно различных объектов, в зависимости от того, что вы передали конструктору, простое, простое, что нужно сделать, это использовать функцию, которая возвращает экземпляры разных классов.
Однако, для полноты картины, вы должны знать, что классы могут определить __new__
метод, который вызывается перед тем __init__
. Этот метод может возвращать экземпляр класса или экземпляр совершенно другого класса или любого другого, что он хочет. Так, например, вы можете сделать это:
class A(object):
def __init__(self):
self.history={}
def do_something(self):
print("Class A doing something", self.history)
class B(object):
def __init__(self):
self.history=[]
def do_something_else(self):
print("Class B doing something", self.history)
class C(object):
def __new__(cls, a=False, b=False):
if a:
return A()
elif b:
return B()
use1 = C(a=True)
use2 = C(b=True)
use3 = C()
use1.do_something()
use2.do_something_else()
print (use3 is None)
Это работает как с Python 2 или 3. С 3 возвращается:
Class A doing something {}
Class B doing something []
True
Что семантика здесь? Вы хотите «условное наследование» или хотите «условную инициализацию»? –
Что произойдет, если 'use3 = C (a = True, b = True)'? – erip
Что бы вы ни пытались сделать здесь, либо вы плохо это объясняете, либо это ужасная идея. Скажите, что вы пытаетесь выполнить, и, скорее всего, лучший способ. – msw