Вызов функции класса из модуля? - PullRequest
1 голос
/ 22 сентября 2011

Я просто пишу фиктивный код для pygame.

Первый пример кода имеет функцию в файле menus.py.Я хотел попрактиковаться в использовании импорта.Это отлично работает.Затем я хотел поместить функцию в класс, чтобы я мог приступить к работе с классами.Это второй блок кода.К сожалению, второй блок кода не запускается.Может кто-нибудь объяснить, где я иду не так, пожалуйста.

# menus.py
def color_switcher(counter, screen):
    black = ( 0, 0, 0)
    white = (255, 255, 255)
    green = (0, 255, 0)
    red = (255, 0, 0)

    colors = [black, white, green, red]
    screen.fill(colors[counter])

# game.py

#stuff
if event.type == pygame.MOUSEBUTTONDOWN:
     menus.color_switcher(counter, screen)
     #more stuff

Это прекрасно работает.

Это не

# menus.py
class Menu:

    def color_switcher(self, counter, screen):
        black = ( 0, 0, 0)
        white = (255, 255, 255)
        green = (0, 255, 0)
        red = (255, 0, 0)

        colors = [black, white, green, red]
        screen.fill(colors[counter])

# game.py

#stuff
if event.type == pygame.MOUSEBUTTONDOWN:
     menus.Menu.color_switcher(counter, screen)
     #more stuff

#TypeError: unbound method color_switcher() must be called with Menu instance as first argument (got int instance instead)

Может кто-то сказать мне, что я делаюне так с классом, пожалуйста?

Ответы [ 4 ]

2 голосов
/ 22 сентября 2011

Это не проблема с import.Поскольку color_switcher не является статическим методом, вы должны сначала создать экземпляр класса, и только затем вызывать функцию-член:

if event.type == pygame.MOUSEBUTTONDOWN:
     menus.Menu().color_switcher(counter, screen)

В качестве альтернативы, вы можете объявить свой класс как

class Menu:
    @staticmethod
    def color_switcher(counter, screen):

а затем использовать его как menus.Menu.color_switcher(counter, screen)

1 голос
/ 22 сентября 2011

Вам нужно создать экземпляр Menu, прежде чем вы сможете вызвать метод. Например:

my_menu = Menu()
my_menu.color_switcher(counter, screen)

В настоящее время вы рассматриваете color_switcher, как если бы это был метод класса .

1 голос
/ 22 сентября 2011

Затем я хотел поместить функцию в класс, чтобы я мог начать работу с классами

Это не так просто.

Вам действительно нужно действительно пройти полное руководство по Python, которое показывает, как выполнять объектно-ориентированное программирование.

Вы редко вызываете метод класса. Редко.

Вы создаете экземпляр класса - объект - и вызываете методы объекта. Не класс. Объект.

x = Menu()
x.color_switcher(counter, screen)
1 голос
/ 22 сентября 2011

Вы пытаетесь вызвать метод экземпляра как метод класса.

Два решения:
1) изменить код клиента: вызвать метод на экземпляре класса

menus.Menu().color_switcher(counter, screen) # note the parentheses after Menu

2) измените определение: измените метод экземпляра на метод класса, используя аннотацию метода класса

...