python中的subtype是什么?

T.__new__S, ... -> a new object with type S, a subtype of T

这里的subtype指的是什么?

class Aint: pass class Bint: def __new__cls: return A.__new__int b = B
isinstanceb, A
#False
typeb
#<class int>

回答问题

subtype如字面意思, 即子类. 通过issubclasscls1, cls2判断cls1是不是cls2的子类.

虽然不太确定你使用的python版本, 以及你的T.__new__S, ...是截取哪个文档, 但就官方说明, X.__init__Y, ...就只是创建Y的实例对象, 跟X没有关系. 前提是X__new__属性, 通过hasattrX, __new__判断.

深度探究

其实这里的重点并非subtype, 而是__new__到底是什么属性.

简单的说, __new__控制对象的创建, 而__init__控制对象的初始化如添加额外的属性变量, __del__控制对象的销毁. 正常情况下, 只需要在乎__init__.

思考一个问题, 标准的实例化对象过程, 如n = N, 是否一定创建的是N的对象?

答案当然是否定的, 代码如下, 以此来详细说明创建对象和初始化对象的区别.

class N: def __init__self, name: self.name = name
class M: def __new__cls, name: return Nname
m = M"enalix"
isinstancem, N #=> true
isinstancem, M #=> false
m.name #=> "enalix"

__new__返回对象时, 会将对象及多余的参数, 传递给对象的__init__, 以进行创建后的初始化.

关于函数

再进一步讲, __new__的参数cls是什么呢?

class P: def __new__cls: return cls
P #=> <class __main__.P>, 即类本身
P.__new__P #=> 同上

这涉及到python的另一个本质特性, 即python是没有方法的, 只有函数. 当执行P, 其实是先执行p1 = P.__new__P, 再执行P.__init__p1.

class X: def helloself: return self.name
X.hellom #=> "enalix"

综上, T.__new__S, ..., 跟T没有关系, 就如hello只是返回selfname属性, 跟X没有关系类似.

额外说明

1, 关于python只有函数的更多描述, 建议阅读本人的文章理解Ruby中的类.

2, 以上代码在python3版本中通过验证, 2.X有细微区别

发表评论

电子邮件地址不会被公开。 必填项已用*标注