2017-12-18 101 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考虑在电子游戏上创建角色。您可以更改初始外观,名称,种族,班级,但您(作为用户)无法更改的内容,例如您的初始级别,初始资金等。 –