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'>
光阴似箭催人老,日月如移越少年。
回答問題
subtype如字面意思, 即子類別. 透過issubclass(cls1, cls2)判斷cls1是不是cls2的子類別.subtype如字面意思, 即子类. 通过issubclass(cls1, cls2)判断cls1是不是cls2的子类.
subtype
子類別
issubclass(cls1, cls2)
cls1
子类
cls2
虽然不太确定你使用的python版本, 以及你的T.__new__(S, ...)是截取哪个文档, 但就官方说明, X.__init__(Y, ...)就只是创建Y的实例对象, 跟X没有关系. 前提是X有__new__属性, 通过hasattr(X, '__new__')判断.
python
T.__new__(S, ...)
X.__init__(Y, ...)
Y
X
__new__
hasattr(X, '__new__')
深度探究
其实这里的重点并非subtype, 而是__new__到底是什么属性.
简单的说, __new__控制对象的创建, 而__init__控制对象的初始化(如添加额外的属性变量), __del__控制对象的销毁. 正常情况下, 只需要在乎__init__.
__init__
__del__
思考一个问题, 标准的实例化对象过程, 如n = N(), 是否一定创建的是N的对象?
n = N()
N
答案当然是否定的, 代码如下, 以此来详细说明创建对象和初始化对象的区别.
class N: def __init__(self, name): self.name = name class M: def __new__(cls, name): return N(name) m = M("enalix") isinstance(m, N) #=> true isinstance(m, M) #=> false m.name #=> "enalix"
当__new__返回对象时, 会将对象及多余的参数, 传递给对象的__init__, 以进行创建后的初始化.
关于函数
再进一步讲, __new__的参数cls是什么呢?
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).
P()
p1 = P.__new__(P)
P.__init__(p1)
class X: def hello(self): return self.name X.hello(m) #=> "enalix"
综上, T.__new__(S, ...), 跟T没有关系, 就如hello只是返回self的name属性, 跟X没有关系类似.
T
hello
self
name
额外说明
1, 关于python只有函数的更多描述, 建议阅读本人的文章理解Ruby中的类.
2, 以上代码在python3版本中通过验证, 2.X
python3
2.X
X code>有__new__屬性, 透過hasattr(X, '__new__')判斷.🎜 🎜🎜深度探究🎜🎜 🎜其實這裡的重點並非subtype, 而是__new__到底是什麼屬性.🎜 🎜簡單的說, __new__控制對象的創建, 而__init__控制對象的初始化(如添加額外的屬性變量), __del__控制對象的銷毀. 正常情況下, 只需要在乎__init__.🎜 🎜思考一個問題, 標準的實例化物件過程, 如n = N(), 是否一定創建的是N的物件?🎜 🎜答案當然是否定的, 程式碼如下, 以此來詳細說明創建物件和初始化物件的區別.🎜 rrreee 🎜當__new__傳回物件時, 會將物件及多餘的參數, 傳遞給物件的__init__, 以進行建立後的初始化.🎜 🎜🎜關於函數🎜🎜 🎜再進一步講, __new__的參數cls是什麼呢?🎜 rrreee 🎜這涉及到python的另一個本質特性, 即python是沒有方法的, 只有函數. 當執行P(), 其實是先執行p1 = P.__new__(P), 再執行P.__init__(p1).🎜 rrreee 🎜綜上, T.__new__(S, ...), 跟T沒有關係, 就如hello只是回傳self 的name屬性, 跟X沒有關係類似.🎜 🎜🎜額外說明🎜🎜 🎜1, 關於python只有函數的更多描述, 建議閱讀本人的文章理解Ruby中的類.🎜 🎜2, 以上程式碼在python3版本中通過驗證, 2.X有細微差別🎜
subtype
如字面意思, 即子類別
. 透過issubclass(cls1, cls2)
判斷cls1
是不是cls2的子類別.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
python
版本, 以及你的T.__new__(S, ...)
是截取哪個文檔, 但就官方說明,X.__init__(Y, ...)
就只是創建Y
的實例物件, 跟X
沒有關係. 前提是X code>有
__new__
屬性, 透過hasattr(X, '__new__')
判斷.🎜 🎜🎜深度探究🎜🎜 🎜其實這裡的重點並非subtype
, 而是__new__
到底是什麼屬性.🎜 🎜簡單的說,__new__
控制對象的創建, 而__init__
控制對象的初始化(如添加額外的屬性變量),__del__
控制對象的銷毀. 正常情況下, 只需要在乎__init__
.🎜 🎜思考一個問題, 標準的實例化物件過程, 如n = N()
, 是否一定創建的是N
的物件?🎜 🎜答案當然是否定的, 程式碼如下, 以此來詳細說明創建物件和初始化物件的區別.🎜 rrreee 🎜當__new__
傳回物件時, 會將物件及多餘的參數, 傳遞給物件的__init__
, 以進行建立後的初始化.🎜 🎜🎜關於函數🎜🎜 🎜再進一步講,__new__
的參數cls
是什麼呢?🎜 rrreee 🎜這涉及到python
的另一個本質特性, 即python
是沒有方法的, 只有函數. 當執行P()
, 其實是先執行p1 = P.__new__(P)
, 再執行P.__init__(p1)
.🎜 rrreee 🎜綜上,T.__new__(S, ...)
, 跟T
沒有關係, 就如hello
只是回傳self
的name
屬性, 跟X
沒有關係類似.🎜 🎜🎜額外說明🎜🎜 🎜1, 關於python
只有函數的更多描述, 建議閱讀本人的文章理解Ruby中的類.🎜 🎜2, 以上程式碼在python3
版本中通過驗證,2.X
有細微差別🎜