T.__new__(S, ...) -> a new object with type S, a subtype of T
这里的subtype指的是什么?
class A(int):
pass
class B(int):
def __new__(cls):
return A.__new__(int)
b = B()
isinstance(b, A)
#False
type(b)
#<class 'int'>
T.__new__(S, ...) -> a new object with type S, a subtype of T
这里的subtype指的是什么?
class A(int):
pass
class B(int):
def __new__(cls):
return A.__new__(int)
b = B()
isinstance(b, A)
#False
type(b)
#<class 'int'>
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答970 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
subtype
如字面意思, 即子类
. 通过issubclass(cls1, cls2)
判断cls1
是不是cls2
的子类.虽然不太确定你使用的
python
版本, 以及你的T.__new__(S, ...)
是截取哪个文档, 但就官方说明,X.__init__(Y, ...)
就只是创建Y
的实例对象, 跟X
没有关系. 前提是X
有__new__
属性, 通过hasattr(X, '__new__')
判断.其实这里的重点并非
subtype
, 而是__new__
到底是什么属性.简单的说,
__new__
控制对象的创建, 而__init__
控制对象的初始化(如添加额外的属性变量),__del__
控制对象的销毁. 正常情况下, 只需要在乎__init__
.思考一个问题, 标准的实例化对象过程, 如
n = N()
, 是否一定创建的是N
的对象?答案当然是否定的, 代码如下, 以此来详细说明创建对象和初始化对象的区别.
当
__new__
返回对象时, 会将对象及多余的参数, 传递给对象的__init__
, 以进行创建后的初始化.再进一步讲,
__new__
的参数cls
是什么呢?这涉及到
python
的另一个本质特性, 即python
是没有方法的, 只有函数. 当执行P()
, 其实是先执行p1 = P.__new__(P)
, 再执行P.__init__(p1)
.综上,
T.__new__(S, ...)
, 跟T
没有关系, 就如hello
只是返回self
的name
属性, 跟X
没有关系类似.1, 关于
python
只有函数的更多描述, 建议阅读本人的文章理解Ruby中的类.2, 以上代码在
python3
版本中通过验证,2.X
有细微区别