2013-10-02 5 views
0

Так что я делаю небольшую программу Pygame, и я пытаюсь структурировать материал в приличном виде, вот где я застрял.Правильный способ создания подклассов?

class Screen(object): 
    def __init__(self, width, height): 
     self.width = width 
     self.height = height 
     self.SURFACE = 10 # I need this attribute 

class GameMenager(Screen): 
    def __init__(self) # Do I need to put the parameters of the super class here? 
     super().__init__() # What to put in these parantheses? 

Я хочу, чтобы получить атрибут SURFACE, чтобы я мог работать с ним в классе игры, то же самое с измерением атрибутов. Каков правильный способ создания экземпляров классов Screen и GameMenager?

I red about super(), но на самом деле не нашел много информации о том, как создавать подклассы, когда у меня нет параметров в подклассе.

+0

'супер (GameMenager, самость)' – karthikr

+1

В общей ноте стороны, вы что вы хотите, чтобы GameManager наследовал от экрана? Для меня это звучит скорее как компонент игрового менеджера. Что касается __init __(), если у вас есть параметры, отличные от параметров по умолчанию, убедитесь, что ребенок передает правильные параметры родительскому. – user632657

+0

В дополнение к 'super (GameMenager, self)', вам нужно передать аргумент, который требуется конструктору суперкласса, поэтому потребуется нечто вроде 'super (GameMenager, self) .__ init __ (width, height)'. Вы можете просто добавить их в 'def GameManager .__ init __ (self, width, height):' и передать их. – martineau

ответ

3

super используется так:

class Screen(object): 
    def __init__(self, width, height): 
     self.width = width 
     self.height = height 
     self.SURFACE = 10 

class GameMenager(Screen): 
    def __init__(self, width, height): 
     super(GameMenager, self).__init__(width, height) 

Теперь вы можете получить доступ к Screen.SURFACE:

>>> x = GameMenager(1, 2) # I just picked 1 and 2 for width and height. 
>>> x.SURFACE 
10 
>>> 
+0

Вы также можете иметь 'def __init __ (self, * args, ** kwargs)' в подклассе и вызывать 'super (GameMenager, self) .__ init __ (* args, ** kwargs)' – Ewan

+0

@iCodez Не выглядит bizare поставить некоторые случайные значения в качестве параметров суперкласса? Например, 'super(). Init (1, 2)'? – dragons

+0

Обратите внимание, что это действительно неверно - прочитайте [этот праймер на 'super'] (https://fuhm.net/super-harmful/). в частности, вы также должны вызывать 'super' из' Screen' и всегда передавать все аргументы, которые вы получаете, если функции принимают различное количество аргументов – Claudiu

1

Вы не хотите GameMenager быть подклассом, здесь. Скорее всего, вы хотите передать экземпляр экрана к GameMenager например:

class GameMenager(object): 
    def __init__(self, screen): 
     self.screen = screen 
     self.screen.SURFACE #can do w/e you want with it 
    #for example: 
    def print_surface(self): 
     print self.screen.SURFACE 

И создать его экземпляр следующим образом:

>>> s = Screen(640, 480) 
>>> gm = GameMenager(s) 
>>> gm.print_surface() 
10 
+0

Почему вы проходите 640, 480, это только некоторые случайные значения, которые не будут влиять на определенные параметры супер класс? – dragons

+0

@ dragons: да просто случайный. не знаю, что вы хотите передать там – Claudiu

+0

@ Claudiu На самом деле, я просто хочу использовать атрибут «SURFACE» в подклассе. Мне все еще нужно назначить эти случайные параметры суперкласса? – dragons

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