理解Python中的__init__

时间:2017-12-18 11:56:31

标签: python oop

我正在处理我收到的Python文件,当我在Python中进行初始化时,我看到一个包含多种变量的类。我不清楚在定义属性时应该遵循什么逻辑,以及在代码的一部分下面进行初始化或不进行初始化:

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:为什么没有在括号中定义?

  • 为什么quitstart_timecurrent_time未在括号中定义?

  • 如何声明但不初始化与先前未在代码中调用的模块相关的self.pygame

  • 如何使用self.pygame.init()启动另一个模块?

2 个答案:

答案 0 :(得分:5)

  

size:声明它但在初始化时它使用self.env.grid_size [0]。如果env可以有一个未定义或初始化的属性grid_size?

在之前的行中,self.env被设置为用户在创建Simulator实例时提供给初始值设定项的第一个位置参数。由用户提供具有属性grid_size的对象。 (这可能应该通过doc-string或类型提示来提及。)

  

road_with:为什么括号中没有提到它?我会把road_with放在括号中,默认值为44

只让用户知道他必须了解对象的内部工作原理。这是信息隐藏的原则。如果我们的对象的每个实例都应该带有值为road_width的属性44,那么为什么要使用另一个可选参数来打扰用户,因为它不清楚用{{{{}的其他值调用初始值设定项的内容1}}甚至可以吗?

  

bg_c​​olor:为什么没有在括号中定义?
  为什么quit,start_time,current_time没有在括号中定义?

见上文

我不明白你的最后两个问题。

答案 1 :(得分:4)

这里的主要问题似乎是:为什么在__init__中初始化的某些属性也不是__init__的参数?答案是:因为您不希望用户能够设置它们。

例如,那些可以代表对象的一些内部状态。想想Iterator课程。参数可以是列表,但其内部状态也由该列表中的当前索引定义。该索引可以在__init__0初始化,将它作为参数传递是没有意义的。这似乎适用于您的quitstart_timecurrent_time属性。

或许某些属性来自其他属性,例如您可以使用参数Rectanglewidth的{​​{1}}类,以及从这两个参数派生的另一个属性height。这似乎是这种情况,例如对于area属性。

有些属性可能只是不变且不可更改,就像self.screenroad_width一样。如果它们对于每个类的实例都是相同的,那么它们可能会移出实例之外。