python - 从类中创建对象时如何留出内存?
问题描述
我读到__init__
不会创建对象(预留内存)。
我找不到实际创建对象的人。这个对象创建是如何在内部发生的?
解决方案
简短的回答
作为一个简短的回答,创建对象的方法是 __new__
并且__init__
只是初始化创建的对象。
长答案
但是,如果您想更深入地了解在 python 中创建对象时发生了什么,请继续阅读。
在 python 2.x 中,python 旧式和新式类中有两种类型的类。
class C: # A old-style class sample
pass
class C(object): # A old-style class sample
pass
在旧式类中,没有__new__
方法__init__
,构造函数也是如此。但是,在 python 3.x 中,只保留了新样式的类(与您为类选择的任何类型的定义无关,它将继承自基类“Object”)。在新式类中,__new__
和__init__
方法都可用。__new__
and__init__
分别是构造函数和初始化程序,并且您可以覆盖它们(请注意,通常在某些情况下您不需要覆盖__new__
方法期望,例如定义元类等,所以如果它是,请不要操作它没有必要。)最后,当要创建一个对象时,构造函数将在初始化程序之前调用。
class A(object): # -> don't forget the object specified as base
def __new__(cls):
print "A.__new__ called"
return super(A, cls).__new__(cls)
def __init__(self):
print "A.__init__ called"
A()
输出将是:
A.__new__ called
A.__init__ called
推荐阅读
- html - 100% 宽度的表格单元中隐藏的溢出
- sql-server - 加入只返回单行
- react-native - 在导航状态中发现了不可序列化的值。检查:登录> params.store.dispatch(功能)
- core-data - 想将系统设置存储在核心数据中
- c++ - 不允许用返回非常量引用的方法覆盖返回常量引用的虚方法
- node.js - 从支付服务提供商重定向后未设置 Cookie
- laravel - Laravel API 路由 - 异常:“Symfony\Component\HttpKernel\Exception\NotFoundHttpException”
- spring-boot - Kafka消费者错误处理偏移重置
- yolo - 如何使用 yolo v3 模型(有两个输出)检测 ML C# 中的对象?
- elasticsearch - 由于 JNA,在 RHEL 7.8 上安装 elastic 7.5 会导致内存违规 sig=6