jacinli / jacinli.github.io

jacinli blog.
https://jacinli.github.io/
0 stars 0 forks source link

Python 类的定义属性(放在__init__前后) #6

Open jacinli opened 1 week ago

jacinli commented 1 week ago

属性通常在类的构造方法 init 内部定义并初始化,而不是在类定义的顶部静态定义。这是因为 Python 的类属性和实例属性的工作方式不同于一些其他编程语言(如 Java 或 C++),其中你可能会在类的顶部声明所有属性。

为什么在 init 内定义属性? 动态绑定:Python 允许在运行时动态地为对象添加属性。这意味着直到创建类的实例(即调用 init 方法)时,实例属性才被创建并绑定到具体的对象上。 封装性:通过在 init 方法中定义属性,确保了每个类的实例都有自己的独立属性副本。如果在类顶部定义属性,它们将成为类属性,这些属性是由该类的所有实例共享的,这通常不是期望的行为。 self.get_response 和 self.logger 是在构造方法 init 中定义的。每当创建 LogMiddleware 的新实例时,这些属性都会为每个新实例独立创建和初始化。 这种方式保证了 get_response 和 logger 对于每个中间件实例都是唯一的,它们的状态不会意外地在多个中间件实例之间共享。

为什么不在 init 前定义属性? 类属性 vs 实例属性:如果在类定义顶部设置属性,例如 get_response = None,这会创建一个类级别的属性,它将被所有实例共享。这在处理独立且可能不同的 get_response 函数时是不合适的。 初始化逻辑:通常,构造函数用于初始化实例属性。将属性初始化逻辑放在 init 中,可以根据传入参数动态设置属性的初始状态,这提供了更大的灵活性和控制力。 总结来说,将属性初始化放在 init 方法中是 Python 类设计的常见和推荐的做法,它支持更好的封装性和属性初始化的灵活性。