Наследование классов, переопределение __init__ с принятием нового аргумента - PullRequest
2 голосов
/ 11 июля 2011

Я новичок в Python, у меня все еще есть проблемы с семантикой наследования классов.

Ниже приведен соответствующий класс из модуля module.py, который я импортирую:

class Text(Sprite): 
    """ 
    Alphanumeric values displayed on the screen.
    """      
    def __init__(self, value, size, color, angle=0, 
                 x=0, y=0,
                 top=None, bottom=None, left=None, right=None,
                 dx=0, dy=0,
                 interval=1, is_collideable=True):
        self._size = size 
        self._color = color 
        self._value = value
        self._font = pygame.font.Font(None, self._size)
        Sprite.__init__(self, self._create_surface(), angle,
                        x, y,
                        top, bottom, left, right,
                        dx, dy,
                        interval, is_collideable)

, и вот откуда я пытаюсь вызвать его в своей собственной программе:

self.scorebox = games.Text (value = self.scorevar,
                            pygame.font.Font(ardarlingopentype, 50),
                            color = color.white,
                            x = 550,
                            y = 50)

Как видите, синтаксис неправильный, но как мне исправить это так, чтобы я мог наследовать класс Text из своей собственной программы и сделать FONT доступным аргументом, который я могу изменить?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 11 июля 2011

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

Это будет работать:

self.scorebox = games.Text (
                        pygame.font.Font(ardarlingopentype, 50),
                        value = self.scorevar,
                        color = color.white,
                        x = 550,
                        y = 50
)
1 голос
/ 11 июля 2011

Не уверен (обратите внимание, что вы не можете использовать неназванные аргументы после именованного и / или смешивать их - вы использовали неназванный аргумент после 'значения'), но кажется, что вам нужно изменить код следующим образом:

class Text(Sprite): 
    """ 
    Alphanumeric values displayed on the screen.
    """      
    def __init__(self, value, size, color, angle=0, 
                 x=0, y=0,
                 top=None, bottom=None, left=None, right=None, font=None,
                 dx=0, dy=0,
                 interval=1, is_collideable=True):
        self._size = size 
        self._color = color 
        self._value = value
        if font:
            self.font_ = font
        else:
            self._font = pygame.font.Font(None, self._size)
        Sprite.__init__(self, self._create_surface(), angle,
                        x, y,
                        top, bottom, left, right,
                        dx, dy,
                        interval, is_collideable)

А потом:

import pygame
import games

self.scorebox = games.Text (value = self.scorevar,
                            size = 50,
                            color = color.white,
                            x = 550,
                            y = 50)

OR

import pygame
import games

self.scorebox = games.Text (value = self.scorevar,
                            size = 50, 
                            font = pygame.font.Font(ardarlingopentype, 50),
                            color = color.white,
                            x = 550,
                            y = 50)
0 голосов
/ 12 июля 2011

Итак, ребята, я написал разработчикам пакета Livewires;и мне посчастливилось получить ответ от одного из них.

Сначала создайте резервную копию games.py и поместите ее в безопасное место.Таким образом, если вы допустите ошибку, вы всегда сможете восстановить исходный код.

Теперь наш games.py написан поверх библиотеки PyGame, которая предоставляет способ установки шрифта.Как вы уже догадались, это связано со следующей строкой:

> self._font = pygame.font.Font(None, self._size)

Документация доступна в Интернете по адресу http://www.pygame.org/docs/ref/font.html#pygame.font.Font, но я просто кратко изложу здесь.pygame.font.Font () создает новый объект шрифта PyGame, который PyGame использует, чтобы сообщить ему, как рисовать текст.Параметр «None» указывает использовать шрифт по умолчанию, но вместо этого вы можете заменить его полным именем файла шрифта.Самый простой способ сделать это - изменить инициализатор классов Text, передав его в качестве необязательного параметра.

class Text(Sprite):

                  def __init__(self, value, size, color, angle=0,
>                               x=0, y=0,
>                               top=None, bottom=None, left=None, right=None,
>                               dx=0, dy=0,
>                               interval=1, is_collideable=True,
>                               fontfile=None):
>        self._size = size
>        self._color = color
>        self._value = value
>        self._font = pygame.font.Font(fontfile, self._size)
>        Sprite.__init__(self, self._create_surface(), angle,
>                        x, y,
>                        top, bottom, left, right,
>                        dx, dy,
>                        interval, is_collideable)

Затем вы создадите объект Text, вызвав «Text (бла-бла»).бла, fontfile = "/ some / font / file / name.ttf") 'или как там есть имя файла.Любые другие объекты Text, в которых не указан «fontfile», вместо этого автоматически используют «None», что дает им шрифт по умолчанию точно так же, как и раньше.

Так что же означает полный путь файла шрифта для"TimesNewRoman"?Я понятия не имею, что это будет на вашем компьютере.К счастью, PyGame предоставляет возможность не знать: pygame.font.match_font ().Вы можете использовать это в своей собственной программе (вместо того, чтобы больше модифицировать games.py), но вам придется либо «импортировать pygame.font» для себя, либо назвать его «games.pygame.font.match_font ()» - либодолжно работать одинаково хорошо.

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