python - __new__ 在对象创建中没有被调用
问题描述
情况1:
class Person:
def __new__(cls, *args, **kwargs):
print "called"
return super(Person, cls).__new__(cls, *args, **kwargs)
p=Person()
案例2:
class Person(object):
def __new__(cls, *args, **kwargs):
print "called"
return super(Person, cls).__new__(cls, *args, **kwargs)
p=Person()
在第一种情况下,__new__()
不会调用该方法,但在第二种情况下会调用该方法。
如果它没有被调用,那么如何Person
创建对象?
解决方案
我想这与Python2 中的新旧样式类有关:
旧式类实际上没有 __new__ 方法,因为对它们来说 __init__ 是构造函数,所以基本上如果我们有:
class A: def __new__(cls): print "A.__new__ is called" # -> this is never called A()
在这种情况下,__new__ 的主体永远不会被执行,因为它不是旧式类的目的。
在 Python3 中,行为是相同的,无论您是否显式继承了object
以下内容:
class Person1:
def __new__(cls, *args, **kwargs):
print("called")
return super(Person1, cls).__new__(cls, *args, **kwargs)
class Person2(object):
def __new__(cls, *args, **kwargs):
print("called")
return super(Person2, cls).__new__(cls, *args, **kwargs)
p1 = Person1()
p2 = Person2()
当从 3.x 调用时,这些应该打印两次“调用”。
推荐阅读
- ajax - Laravel & Ajax 返回数组响应不解析
- python - Keras 模型构建
- java - 在类路径上多次出现错误而不是警告 logback 资源 [logback.xml]
- reactjs - React Redux - 如何存储表单状态,以便在用户返回页面时再次填充它
- android - 如何为 Android 功能模块声明 Dagger 活动和片段?
- php - 用户可以在我的网站上发布家长评论,但不能回复评论(即留下子评论)
- python - 按范围列出改组
- ios - SVGkit 不工作
- c++ - 重载 << 运算符作为“朋友”函数来打印 BST - C++
- javascript - 另一个页面上的AJAX调用方法