2017-11-19 2 views
1

내가 더 잘 이해하고, 각각 독립적으로 조각을 실행하는 데 LPTHW의 43 교훈을 분해하기 위해 노력하고있어, 그것은LPTHW 43 : 함수 객체에는 속성 '입력'

PS C:\Python> python ex43.py 
Traceback (most recent call last): 
    File "ex43.py", line 67, in <module> 
    a_game.play() 
    File "ex43.py", line 17, in play 
    self.scene_map.opening_scene.enter() 
AttributeError: 'function' object has no attribute 'enter' 
을 반환하는 이유를 이해할 수없는이 없습니다

나는이 코드를 코드의 첫 번째 장면 인으로 만들려고하고 있으며, '각 ​​코드가 어떻게 호출되는지 이해할 수 있도록'중앙 복도에 입력했습니다.

from sys import exit 
from random import randint 

class Scene(object): 

    def enter(self): 
     print "This scene is not yet configured. Subclass it and implement enter()." 
    exit(1) 


class Engine(object): 

    def __init__(self, scene_map): 
     self.scene_map = scene_map 

    def play(self): 
     self.scene_map.opening_scene.enter() 

class Death(Scene): 

    def enter(self): 
     pass 

class CentralCorridor(Scene): 

    def enter(self): 
     print "You've entered the central corridor." 

class LaserWeaponArmory(Scene): 

    def enter(self): 
     pass 

class TheBridge(Scene): 

    def enter(self): 
     pass 


class EscapePod(Scene): 

    def enter(self): 
     pass 


class Map(object): 

    scenes = { 
      'central_corridor': CentralCorridor(), 
      'laser_weapon_armory': LaserWeaponArmory(), 
      'the_bridge': TheBridge(), 
      'escape_pod': EscapePod() 
      } 

    def __init__(self, start_scene): 
     self.start_scene = start_scene 

    def next_scene(self, scene_name): 
     val = Map.scenes.get(scene_name) 
     return val 

    def opening_scene(self): 
     return self.scene_map.opening_scene.enter(self.start_scene) 

a_map = Map('central_corridor') 
a_game = Engine(a_map) 
a_game.play() 

실행하면 위의 오류가 발생합니다. 나는 그래서 코드를해야 문제, 당신은 ()을 사용해야합니다 '놀이'파이썬의 모든 기능을 당신이 그들을, 그들에게 전화 실행하려면 때문에 년대 'opening_scene'

+0

'def play (self) :'내용을'self.scene_map.opening_scene()'으로 바꾸어보세요. 그게 뭐야? – roganjosh

+0

나는 당신이 제안한 것을 대체하고'return self.opening_scene (self.start_scene)'로 바꾼다. 'TypeError : opening_scene()은 정확히 1 개의 인수 (주어진 2 개)' if 'TypeError : opening_scene()은 정확히 2 개의 인수 (주어진 1 개)를받습니다. ' 2 개의 인수를 주면 1 개의 인수가 걸리는 것처럼 보이지만, 1을 주면 2 개의 인수가 필요합니다. – Cdhippen

+0

이러한 변경 사항은 제안하지 않았습니다. 특히'def play (self) :'를 사용하고'self.scene_map.opening_scene.enter()'를'self.scene_map.opening_scene()'으로 대체하십시오. 그 하나가 당신에게주는 변화는 무엇입니까? – roganjosh

답변

0

를 시작하는 방법을보고을 가진 것 같아 :

class Engine(object): 

    def __init__(self, scene_map): 
     self.scene_map = scene_map 

    def play(self): 
     self.scene_map.opening_scene().enter() 

아니면 단지 :

def play(self): 
     self.scene_map.opening_scene() 
+0

나는 운동의 아이디어가 네임 스페이스 혼란을 일으키는 것이라고 생각하기 때문에 클래스 속성이나 다른 객체의 메소드를보고 있는지 알 수 없다. – roganjosh

+0

그런 식으로 실행 한 후 새로운 오류가 발생했습니다. "PS C : \ Python> python ex43.py 트레이스 백 (최근 호출 마지막) : 파일"ex43.opening_scene 대가 평 ", a_game.play() 파일 라인 67"ex43.py "연극에서, 라인 (17), self.scene_map.opening_scene() 파일"ex43.py ", 63 행, self.scene_map.opening_scene.enter (self.start_scene) AttributeError : 'Map'객체에 'scene_map'속성이 없습니다. " – Cdhippen

0

이 스레드를 통해 답변을 찾을 수 있었다 : 기본적으로 r/learnpython

을, 나는 칼이었다 ling 'opening_scene'opening_scene '대신에 a.game.play()를 통해 Map에 전달되는 장면을 return self.scenes[self.start_scene].enter()에 의해 호출해야합니다.이 장면은 전달 된 장면에 대해'enter() '를 실행합니다. 오프닝 씬은 'central_corridor'로 설정되어 있기 때문에 사전에서 실행되도록 꺼내야합니다. 나는 이것이 의미가 있고 그것이 느끼는 것처럼 흩어지지 않기를 바란다.

관련 문제