找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1957|回复: 2

[求助] 新手求助关于一个__new__返回的疑问

1

主题

4

帖子

4

积分

贫民

积分
4
shidb 发表于 2020-9-14 16:17:35 | 显示全部楼层 |阅读模式
各路大佬,我在看文档时关于__new__的描述中有这样一段话,始终不得理解,请明白人帮忙解惑,拜谢!!
如果 __new__() 在构造对象期间被发起调用并且它返回了一个实例或 cls 的子类,则新实例的 __init__() 方法将以 __init__(self[, ...]) 的形式被发起调用,其中 self 为新实例而其余的参数与被传给对象构造器的参数相同。


如上,返回一个实例是正常的情况,但返回一个cls的子类是种什么情况呢?我开始以为是返回子类的实例,但看英文文档也是"it returns an instance or subclass of cls"
我搜了半天也没找到返回子类的示例,还请明白人帮忙给个简单的例子,谢谢了!

这个知识点不理解了,心里实在是憋的慌.
回复

使用道具 举报

1

主题

4

帖子

4

积分

贫民

积分
4
shidb  楼主| 发表于 2020-9-15 14:47:01 | 显示全部楼层
人工置顶,继续求解
回复 支持 反对

使用道具 举报

1

主题

4

帖子

4

积分

贫民

积分
4
shidb  楼主| 发表于 2020-9-16 11:00:59 | 显示全部楼层
两天过去了,总算差不多理清了.是我开始看的时候不够细致,钻牛角尖了.
文档:
如果 __new__() 在构造对象期间被发起调用并且它返回了一个实例或 cls 的子类,则新实例的 __init__() 方法将以 __init__(self[, ...]) 的形式被发起调用,其中 self 为新实例而其余的参数与被传给对象构造器的参数相同。
如果 __new__() 未返回一个 cls 的实例,则新实例的 __init__() 方法就不会被执行。

给个例子帮助理解:
  1. class human:
  2.     def __new__(cls,s):
  3.         print('__new__ called')
  4.         if s=='US':
  5.             type(american)
  6.             return american
  7.         else:
  8.             return super().__new__(cls)

  9.     def __init__(self,s):
  10.         print('__init__ called',s)
  11.         self.name=s
  12.         
  13. class american(human):
  14.     "叫爸爸"
  15.     pass

  16. #######################
  17. >>> a=human('US')
  18. __new__ called
  19. >>> b=human('xx')
  20. __new__ called
  21. __init__ called xx
  22. >>> c=a('oo')
  23. __new__ called
  24. __init__ called oo
  25. >>> c.name
  26. 'oo'
  27. >>> a.__doc__
  28. '叫爸爸'
  29. >>>
复制代码

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表