鱼C论坛

 找回密码
 立即注册
查看: 5699|回复: 7

[已解决]求助TypeError: object() takes no parameters

[复制链接]
发表于 2016-7-11 19:40:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class Person():
    """Silly Person"""
    def __new__(cls,name,age):
        print('__new__ called.')
        return super(Person,cls).__new__(cls,name,age)
    def __init__(self, name, age):
        print('__init__ called.')
        self.name = name
        self.age = age
    def __str__(self):
        return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
    piglei = Person('piglei', 67)
    print (piglei)

程序输出报错:
__new__ called.
Traceback (most recent call last):
  File "E:\eclipse工作目录\TestPython\输入中文设置.py", line 25, in <module>
    piglei = Person('piglei', 67)
  File "E:\eclipse工作目录\TestPython\输入中文设置.py", line 17, in __new__
    return super(Person,cls).__new__(cls,name,age)
TypeError: object() takes no parameters

最佳答案
2016-7-11 20:49:09
本帖最后由 SixPy 于 2016-7-12 06:36 编辑
miaohai777 发表于 2016-7-11 20:20
这个程序是学习__new__与__init__的区别
这三行程序是为了显示程序先调用__new__
可以修改使这个程序能 ...


class Person(object):  # 明确指定继承关系,object 是所有对象的根对象
    """Silly Person"""
    def __new__(cls,name,age):
        print('__new__ called.')
        return super(Person,cls).__new__(cls)# 只传递对象自身
    def __init__(self, name, age):
        print('__init__ called.')
        self.name = name
        self.age = age
    def __str__(self):
        return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
    piglei = Person('piglei', 67)
    print (piglei)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-11 20:16:28 | 显示全部楼层
    def __new__(cls,name,age):
        print('__new__ called.')
        return super(Person,cls).__new__(cls,name,age)


把这三行删除
不理解的程序就别瞎复制粘贴~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-11 20:20:50 | 显示全部楼层
SixPy 发表于 2016-7-11 20:16
def __new__(cls,name,age):
        print('__new__ called.')
        return super(Person,cls)._ ...

这个程序是学习__new__与__init__的区别
这三行程序是为了显示程序先调用__new__
可以修改使这个程序能运行畅通吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-11 20:49:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 SixPy 于 2016-7-12 06:36 编辑
miaohai777 发表于 2016-7-11 20:20
这个程序是学习__new__与__init__的区别
这三行程序是为了显示程序先调用__new__
可以修改使这个程序能 ...


class Person(object):  # 明确指定继承关系,object 是所有对象的根对象
    """Silly Person"""
    def __new__(cls,name,age):
        print('__new__ called.')
        return super(Person,cls).__new__(cls)# 只传递对象自身
    def __init__(self, name, age):
        print('__init__ called.')
        self.name = name
        self.age = age
    def __str__(self):
        return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
    piglei = Person('piglei', 67)
    print (piglei)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-11 21:10:32 | 显示全部楼层
SixPy 发表于 2016-7-11 20:49
class Person(object):  # 明前指定继承关系,object 是所有对象的根对象
    """Silly Person"""
   ...

万分感谢!!!!

还是有点不明白,为什么__new__只传入对象自身,而不需要传递参数?
__init__根据返回的实例进行初始化,__new__不传递参数,__init__中的参数怎么传入的?

class PositiveInteger(int):
    def __new__(cls, value):
        return super(PositiveInteger, cls).__new__(cls, abs(value))
i = PositiveInteger(-3)
print(i)
这个例子中__new__传递参数了,且程序运行正常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-11 21:28:28 | 显示全部楼层
miaohai777 发表于 2016-7-11 21:10
万分感谢!!!!

还是有点不明白,为什么__new__只传入对象自身,而不需要传递参数?

__new__ 只是个函数名

object.__new__

int.__new__

是两个不同的函数,接受的参数当然不同~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-11 21:34:34 | 显示全部楼层
SixPy 发表于 2016-7-11 21:28
__new__ 只是个函数名

object.__new__

虽然还是稀里糊涂,膜拜大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-11 22:02:55 | 显示全部楼层
miaohai777 发表于 2016-7-11 21:34
虽然还是稀里糊涂,膜拜大神

你先把继承关系搞清楚
再看看 super()的用法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-18 14:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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