2011-09-22 3 views
1

저는 파이 게임을위한 더미 코드를 작성하고 있습니다.모듈에서 클래스 함수를 호출합니까?

첫 번째 코드 샘플은 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) 

누군가가 내가 클래스하시기 바랍니다 잘못 뭐하는 거지 말해 주시겠습니까?

+0

참고 : Python 2를 사용하는 경우'class Menu :'대신'class Menu (object) :'를 사용해야합니다. –

+2

'staticmethod','classmethod' 및 일반적으로 객체 인스턴스에 대해 읽어야 할 것들.또한 파이썬에서 인스턴스 데이터가 없다면 --- 클래스의 모든 "메소드"가 정적 메소드이고'self'를 사용할 필요가 없다는 것에주의하십시오. 일반적으로 클래스를 사용해서는 안됩니다. 모듈에서 함수를 사용하십시오. 그들은 나쁘지 않다. –

+0

고마워, 내가 추가했지만 오류가 여전히 발생하고 있습니다. 편집 : 나는 클래스 문서를 읽고있다. 이것이 내가 지금까지 얻은 방법이지만, 나의 훈련받지 않은 눈이 내 코드 샘플에 별다른 차이가 없다는 것을 알 수있다. – JohnnyFive

답변

2

이는 import에서 문제가되지 않습니다. 당신이

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

로 클래스를 선언하고 menus.Menu.color_switcher(counter, screen)로 사용할 수 있습니다, 또는

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

: color_switcher 정적 방법이 없기 때문에, 당신은 멤버 함수를 첫 번째 클래스의 인스턴스를 생성하고, 그런 다음에야 호출해야합니다

+0

이것은 메서드가 아니라 함수이며 클래스의 클래스 메서드를 호출 할 수도 있습니다. – agf

+0

@agf 수정 해 주셔서 감사합니다. 내 대답이 업데이트되었습니다. – aland

1

클래스 메서드로 인스턴스 메서드를 호출하려고합니다.

두 용액 :
1) 클라이언트 코드 변경 : 클래스

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

2)의 인스턴스의 메소드를 호출 정의 변경 : class method annotation

를 이용한 클래스 방법 인스턴스 방법을 변경 내가 일어나서 클래스를 실행 할 수 있습니다
1

나는 다음 수업 시간에 기능을 넣어 싶어

그렇게 간단하지 않습니다.

정말, 정말로, 정말로 객체 지향 프로그래밍을하는 방법을 보여주는 완전한 파이썬 튜토리얼을 할 필요가 있습니다.

클래스의 메서드는 거의 호출하지 않습니다. 드물게.

클래스의 인스턴스 (개체)를 만들고 개체의 메서드를 호출합니다. 수업이 아니야. 그 물체.

x = Menu() 
x.color_switcher(counter, screen) 
1

메서드를 호출하기 전에 Menu의 인스턴스를 만들어야합니다. 예를 들어 : 그것은 class method 인 것처럼

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

현재 color_switcher 치료된다.