python - `__new__` 和 `__init__` 在类和对象上
问题描述
在 Python 3 中,定义子类时,为什么需要cls
作为 的第一个参数__new__
,而不是self
作为 的第一个参数__init__
?
一个例子:
class MyClass(object):
def __new__(cls, *args, **kwargs):
return super(MyClass, cls).__new__(cls, *args, **kwargs) # with `cls`
def __init__(self, *args, **kwargs):
return super(MyClass, self).__init__(*args, **kwargs) # without `self`
当我比较这些功能时,我变得更加困惑:
>>> cls = object
>>> self = cls()
>>> cls.__new__ is self.__new__
True
>>> cls.__init__ is self.__init__
False
>>> self.__init__()
>>> cls.__init__()
Traceback (most recent call last): ...
那么,这些结果之间__new__
和__init__
背后的区别是什么?哪些方法是绑定的,哪些是免费的?为什么能打电话self.__init__()
却不能cls.__init__()
?方法是在其自身还是在其元类中cls.__init__
定义的?cls
解决方案
推荐阅读
- postgresql - 无法运行 scm_prepare_database.sh 脚本
- javascript - 以下错误源自您的应用程序代码,而不是赛普拉斯
- flutter - 如何确保小部件在屏幕上可见?
- flutter - AutomaticKeepAliveClientMixin 不适用于 BottomNavigationBar 页面
- python - 替换大型数据集中数据格式的最佳方法是什么?
- javascript - 引导轮播指示器可防止事件冒泡
- asp.net-core-webapi - 如何以角度10发送文件以及formdata中的数据
- python - 无法使用 spyder ide 在 python 3 上安装 PyQt5
- php - 在laravel中完成付款后如何重定向到帖子页面
- java - 在spring应用程序中使用onAuthenticationSuccess登录页面后将用户重定向到原始url