2017-12-18 1 views
2

저는받은 Python 파일에 대해 작업 중이며 Python으로 초기화 할 때 많은 종류의 변수가있는 클래스를 보았습니다. 예를 들어Python에서 __init__을 이해하십시오.

class Simulator(object): 
    colors = {'gray' : (155, 155, 155)} 

    def __init__(self, env, size=None, update_delay=2.0, display=True): 
     self.env = env 
     self.size = size if size is not None else self.env.grid_size[0] 
     self.road_width = 44 
     self.bg_color = self.colors['gray'] 

     self.quit = False 
     self.start_time = None 
     self.current_time = 0.0 
     if self.display: 
      try: 
       self.pygame = importlib.import_module('pygame') 
       self.pygame.init() 
       self.screen = self.pygame.display.set_mode(self.size) 

:

  • env : 나는 속성을 정의 할 때 따라야하고 어떤 것들 코드의 일부가 아래에, 초기화 여부를 무엇 논리는 나에게 분명하지 않다 그것이 괄호 안에 선언하고 나중에 초기화 됨 -> 지우기

  • size : 초기화되었지만 self.env.grid_size[0]을 사용합니다. 어떻게 이 정의되거나 초기화되지 않았습니까?

  • road_with : 왜 괄호 안에 언급되지 않습니까? 나는 방금 road_with을 괄호 안에 기본값 44를 넣었을 것입니다.

  • bg_color : 왜 괄호 안에 정의되어 있지 않습니까?

  • quit, start_time, current_time은 괄호 안에 정의되어 있지 않습니까?

  • 코드에서 이전에 호출되지 않은 모듈과 관련된 self.pygame을 선언하지만 초기화하지 않는 방법은 무엇입니까?

  • self.pygame.init()으로 다른 모듈을 초기화하는 방법은 무엇입니까?

+3

python 외에 다른 언어로 작업하셨습니까? –

답변

5

사이즈 :이 선언하지만 초기화 때 사용 self.env.grid_size [0]. env가 정의되지 않았거나 초기화되지 않은 grid_size 속성을 갖는 방법은 무엇입니까? Simulator의 인스턴스를 생성 할 때 이전 라인에

self.env은 초기화로 제 1 위치 인수로 사용자 용품을 설정한다. grid_size 속성을 가진 객체를 제공하는 것은 사용자가 결정합니다. (이것은 아마도 문서 문자열 또는 형식 힌트로 언급해야합니다.)

road_with : 왜 괄호 안에 언급되어 있지 않습니까? 나는 방금 기본값을 가진 괄호 안에 road_with를 넣었을 것입니다.

오브젝트의 내부 동작에 대해 사용자가 알아야하는 것만 알리십시오. 정보 숨기기의 원칙입니다. 개체의 모든 인스턴스에 값이있는 경우 44 값을 가진 다른 사용자가 road_width 값을 가진 이니셜 라이저를 호출하는 것이 명확하지 않은 다른 선택적 인수로 사용자를 괴롭히는 이유는 무엇입니까?

bg_color : 왜 괄호 안에 정의되어 있지 않습니까?
quit, start_time, current_time이 (가) 괄호 안에 정의되지 않은 이유는 무엇입니까?

위에 나는 마지막 두 가지 질문을 이해하지 못하는 참조하십시오.

4

여기에서 가장 중요한 질문은 다음과 같습니다. __init__으로 초기화되는 일부 속성이 왜 __init__의 매개 변수가 아닌지? 그 대답은 : 사용자가 설정을 원하지 않기 때문입니다.

예를 들어, 그 객체의 일부의 내부 상태를 나타낼 수있다. Iterator 클래스를 생각해보십시오. 매개 변수는 목록 일 수 있지만 내부 상태는 해당 목록의 현재 색인에 의해 정의됩니다. 해당 인덱스는 __init__에서 0으로 초기화 될 수 있으며 매개 변수로 전달하는 것은 의미가 없습니다. 이것은 귀하의 quit, start_timecurrent_time 속성`에 적용되는 것으로 보입니다.

아니면 일부 속성은, 예를 들어 다른 사람에서 파생 된

당신은 매개 변수 widthheight, 그 두 개의 매개 변수에서 파생 된 또 다른 속성 area, 더불어 Rectangle 클래스를 가질 수있다. 예를 들어, self.screen 속성의 경우

road_widthcolor의 경우와 같이 일부 속성은 일정하고 변경할 수 없습니다. 어쨌든 클래스의 각 인스턴스에 대해 동일한 경우 인스턴스 외부로 이동할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 기본적으로 괄호 안의 매개 변수는 사용자가 수정할 수 있도록 허용하려는 모든 매개 변수를 초기화하는 반면 괄호 안에는 포함시키지 마십시오. 논리입니까? – Mariano

+0

@Mariano 예, 그게 전부입니다. 디폴트 값 _can_가 제공되는 매개 변수, _ 제공되어야 할 매개 변수가없는 매개 변수 및 해당 매개 변수가없는 속성은 사용자가 제공 할 수 없습니다. –

+1

@Mariano 비디오 게임에서 캐릭터를 만드는 것을 고려하십시오. 초기 모양, 이름, 인종, 클래스를 변경할 수 있지만 초기 수준, 초기 금액 등 사용자가 변경할 수없는 항목이 있습니다. –

관련 문제