2017-12-18 100 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]env如何可以有一個屬性grid_size它沒有被定義或初始化?

  • 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,它沒有被定義或初始化?

在之前的線,self.env正在創建的Simulator一個實例,當用戶設備設置爲第一位置參數來初始化。用戶可以提供具有屬性grid_size的對象。 (這應該可以通過文檔字符串或類型提示來提及。)

road_with:爲什麼在括號中未提及?我只是將road_with放在括號中,其默認值爲44

只讓用戶知道他必須知道對象的內部運作情況。這是信息隱藏的原則。如果我們的對象的每個實例都應該帶有值44的屬性road_width,爲什麼會打擾用戶使用另一個可選參數,但不清楚使用road_width的其他值調用初始化程序甚至可以做什麼?

bg_c​​olor:爲什麼它沒有在括號中定義?
爲什麼quit,start_time,current_time沒有在括號中定義?

見上

我不明白你的最後兩個問題。

4

這裏的主要問題似乎是:爲什麼在__init__中初始化的某些屬性不是__init__的參數?答案是:因爲你不希望用戶能夠設置這些。

例如,那些可能代表對象的一些內部狀態。想一想Iterator課。該參數可以是一個列表,但其內部狀態也由該列表中的當前索引定義。該索引可以在__init__0之間初始化,將它作爲參數傳遞是沒有意義的。這似乎適用於您的quitstart_timecurrent_time屬性。

或者也許某些屬性是從其他人獲得的,例如,你可以有一個Rectangle級別,參數爲widthheight,以及另一個屬性area,它是從這兩個參數派生的。這似乎是這種情況,例如爲self.screen屬性。

而一些屬性可能只是恆定不變,如road_widthcolor的情況。那些可能會被移出實例,如果它們對於類的每個實例都是相同的。

+0

謝謝你的回覆。所以基本上括號中的參數是你想允許用戶修改的那些參數,而你初始化的所有其他參數卻不包括在括號中,那麼邏輯是什麼? – Mariano

+0

@Mariano是的,就是這樣。可以提供具有缺省值_can_的參數,沒有提供_have的參數以及沒有相應參數的參數不能由用戶提供。 –

+1

@Mariano考慮在電子遊戲上創建角色。您可以更改初始外觀,名稱,種族,班級,但您(作爲用戶)無法更改的內容,例如您的初始級別,初始資金等。 –