2015-03-05 2 views
0

У меня есть базовый класс, объекты которого я всегда хочу создать с помощью фабричного объекта.Использовать фабричный объект для инициализации базового класса

class Shape: 
    def __init__(self): 
    pass 

class ShapeMgr: 
    def __init__(self): 
    self.allShapes = [] 

    def new(self): 
    newShape = Shape() 
    self.allShapes.append(newShape) 
    return newShape 

Я также получил классы из этого базового класса.

class Circle(Shape): 
    def __init__(self): 
    pass 

Я хочу инициализировать базовый класс объектов производного класса от фабричного объекта. IE, я хочу, чтобы создал часть формы круга, вызывая ShapeMgr.new().

Я попытался определения конструктора Shape следующим образом:

SM = ShapeMgr() 
class Circle: 
    def __init__(self): 
    global SM 
    super() = SM.new() 

Но он говорит мне, что я не могу присвоить результат вызова функции. Если я вместо этого попробовать:

self = SM.new() 

Тогда позже, когда я пытаюсь получить доступ к методам Circle, он говорит, что формы не имеют методы Circle.

Можно ли использовать фабрику для создания базовой части класса объекта производного класса?

+0

У каждого ребенка формы действительно нужен собственный менеджер? –

+0

Каждый из ваших 'def' должен иметь 'self' в качестве первого параметра. –

+0

-Ignacio: Да, в моем действительном приложении. Но это не имеет отношения к вопросу, поэтому я удалил его. -Этот: фиксированный. – AngryPuffin

ответ

0

Если вы хотите Circle вызвать Shape для инициализации, просто сделайте так:

class Circle(Shape): 
    def __init__(self): # important! 
     super().__init__() 

Если ваша цель состоит в том, чтобы иметь Circle s в конечном итоге в ShapeMgr, вам не нужно беспокоиться о базовом классе (Shape), потому что ничего в Shape не приводит к регистрации.

Изменения ShapeMgr.new() принимать необязательный объект для регистрации, и если объект не задан, то создать новый Shape:

def new(self, obj=None): 
    if obj is None: 
     obj = Shape() 
    self.allShapes.append(obj) 

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

+0

Возможно, это было недостаточно подчеркнуто - я не хочу называть конструктор Shape. Я хочу вызвать SM.new(), чтобы он зарегистрировался в ShapeMgr. – AngryPuffin

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