python __new__方法的一些疑问

凡人皆侑一死 2018-03-26 06:34:32
问题一:Fu的new方法 如果把return改成 return object.__new__(Fu,name,age)就报错,说TypeError: object() takes no parameters 这个new不是给init提供实例的参数的吗,不写居然能通过,难道是python版本的兼容,我用的3.6
问题二:Zi的new函数将zi定义成了Mu类型,不应该调用了mu类的init方法吗,但报错AttributeError: 'Mu' object has no attribute 'name' 有点不解,有哪位大神知道吗?
class Fu(object):
def __new__(cls,name,age):
print("Fu new running!")
return object.__new__(Fu)

def __init__(self,name,age):
print("Fu init running")
self.name=name
self.age=age

class Zi(Fu):
#先不写new函数,那么Zi必然使用父类的new方法
def __init__(self,name,age):
print("Zi init running")
self.name=name
self.age=age+100

# 此处使用mu作为类的实例
def __new__(cls,name,age):
print("Fu new running!")
return object.__new__(Mu)

class Mu(object):
def __init__(self,name,age):
self.name="mu"+name
self.age=age*10

def __new__(cls,name,age):
return object.__new__(Mu)

fu=Fu('chilo','24')
print(fu.name)
print(fu.age)
print(type(fu))

zi=Zi('jacket',25)
print(zi.name)
print(zi.age)
print(type(zi))

print(isinstance(zi,Fu))
...全文
360 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
凡人皆侑一死 2018-03-28
  • 打赏
  • 举报
回复
引用 1 楼 qq_26877377 的回复:
大哥~~建议去百度一下__new__的方法使用。。。__new__是在对象创建之前调用来实例化对象的,不是给__init__来传参的,要给__init__传参在fu=Fu('chilo','24')这里写就可以了,
return object.__new__(Fu)
这里一般是写 return object.__new__(cls)

第二个从来没见过这样写的,要就直接继承Mu
__new__ 提供实例的参数,以及明确使用哪个类的init方法,这张图是大神的讲解,原文链接:http://www.cnblogs.com/ifantastic/p/3175735.html
  • 打赏
  • 举报
回复
大哥~~建议去百度一下__new__的方法使用。。。__new__是在对象创建之前调用来实例化对象的,不是给__init__来传参的,要给__init__传参在fu=Fu('chilo','24')这里写就可以了, return object.__new__(Fu) 这里一般是写 return object.__new__(cls) 第二个从来没见过这样写的,要就直接继承Mu

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧