Python中不使用__init__方法能否直接访问类和对象?__init__是构造函数吗?
Python
__init__ 常见问题解答 1. 不定义/不执行 __init__ 时,能否正常访问类和实例对象?
完全可以,分两种场景说明:
- 类本身的访问和
__init__完全无关
不管你有没有定义__init__,类的属性、类方法、静态方法都可以直接通过类名访问,不需要创建实例,也不需要触发__init__的执行:class Demo: class_val = "类属性" @classmethod def cls_func(cls): return "类方法" # 直接访问完全正常 print(Demo.class_val) print(Demo.cls_func()) - 就算没有
__init__也可以正常创建、访问实例
Python创建实例的核心逻辑是:先调用魔术方法__new__分配内存、生成空白的类实例,之后才会调用__init__给实例做初始化赋值。如果你没有自定义__init__,Python会自动提供一个无参数的空实现,完全不影响实例的创建和基础访问:
哪怕你刻意跳过class Demo: def hello(self): return "实例方法" obj = Demo() print(obj.hello()) # 正常执行__init__的执行,直接调用__new__拿到的实例也是合法可用的:obj2 = Demo.__new__(Demo) print(isinstance(obj2, Demo)) # 输出 True print(obj2.hello()) # 仍然可以正常调用实例方法
2. __init__ 是否等同于类的构造函数?
完全不等同,这是Python入门常见的认知误区。
其他语言(比如C++、Java)里的构造函数负责「分配内存+初始化实例」两个步骤,但Python把这两个步骤拆成了两个独立的魔术方法:
- 真正承担构造职责的是
__new__:负责为实例分配内存空间,生成并返回空白的类实例 __init__只是实例初始化方法:只负责接收__new__返回的空白实例,给实例绑定属性、设置初始值,它本身没有返回值(默认返回None,如果手动返回非None值会直接抛出TypeError)
可以通过执行顺序验证逻辑:
class Test: def __new__(cls): print("步骤1:执行__new__,创建并返回空白实例") return super().__new__(cls) def __init__(self): print("步骤2:执行__init__,为实例初始化属性") self.val = 10 obj = Test()
运行后输出顺序和预期完全一致,也能佐证__init__并不负责实例的构造。
内容的提问来源于stack exchange,提问作者Abdul Wahab
相关产品推荐
相关产品推荐

