2015-09-16 1 views
2

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

class A: 
    def __init__(self): 
     self.history={} 
    def do_something(): 
     pass 

class B: 
    def __init__(self): 
     self.history=[] 
    def do_something_else(): 
     pass 

class C(A,B): 
    def __init__(self, a=False, b=False): 
     if a: 
      A.__init__(self) 
     elif b: 
      B.__init__(self) 

use1 = C(a=True) 
use2 = C(b=True) 
+3

Что семантика здесь? Вы хотите «условное наследование» или хотите «условную инициализацию»? –

+1

Что произойдет, если 'use3 = C (a = True, b = True)'? – erip

+2

Что бы вы ни пытались сделать здесь, либо вы плохо это объясняете, либо это ужасная идея. Скажите, что вы пытаетесь выполнить, и, скорее всего, лучший способ. – msw

ответ

3

Я предполагаю, что по какой-то причине вы не можете изменить A и B, и вам нужна функциональность обоих.

Может быть, что вам нужно два разных класса:

class CAB(A, B): 
    '''uses A's __init__''' 

class CBA(B, A): 
    '''uses B's __init__''' 

use1 = CAB() 
use2 = CBA() 

Цель состоит в том, чтобы динамически создать класс.

Я действительно не рекомендую динамически создавать класс. Вы можете использовать функцию, чтобы сделать это, и вы можете легко сделать такие вещи, как рассол экземпляров, потому что они доступны в глобальном пространстве имен модуля:

def make_C(a=False, b=False): 
    if a: 
     return CAB() 
    elif b: 
     return CBA() 

Но если вы настаиваете на «динамически создавать класс»

def make_C(a=False, b=False): 
    if a: 
     return type('C', (A, B), {})() 
    elif b: 
     return type('C', (B, A), {})() 

а использование либо способ:

use1 = make_C(a=True) 
use2 = make_C(b=True) 
+0

Спасибо. Возможно ли, что я упустил что-то для множественного наследования. Я чувствую, что я работаю над тем, чтобы стрелять в самых разных направлениях, что я не хочу, чтобы это стало невозможно понять. Например, для этих историй будет много разных типов историй, а также множество типов результатов, и я хочу собрать их и по-прежнему оставлять место для настройки. Что я должен искать? – jamesRH

+1

@ user3790927 Я не знаю, что вы должны делать Google. Я предполагаю, что по какой-то причине вы не можете изменить A и B, и вам нужна функциональность обоих. Что вы должны сделать, так это выбрать ответ, который наилучшим образом отвечает на ваш вопрос, как вы его дали (вы получите плюс 2 для своего представителя за это), и подумайте еще немного о том, что вы хотите сделать, и попытайтесь лучше сообщить, что в следующем вопросе, или посетите нас в чат-чате python, когда вы получите достаточное количество репутаций, чтобы это сделать. http://chat.stackoverflow.com/rooms/6/python –

2

вы, наверное, на самом деле не нужно, и это, вероятно, проблема 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 

 Смежные вопросы

  • Нет связанных вопросов^_^