python3.3 以上版本的新式类中,如何在同时覆盖 __new__ 和 __init__ 时,将自定义的额外参数从 __new__ 传入 __init__ ?

2016-11-28 13:56:23 +08:00
 mgna17

下面的代码我的一个 class ,如何将一些自定义参数在__new__中 return object.__new__(cls) 的时候传入 __init__ 呢?

比如,我在写 python2 的时候可以直接 return object.__new__(cls, arg0, arg1, **kwargs), python3.3+就不能直接这样写了。

python3.3 以上的版本在 return object.__new__(cls) 时直接传入自定义参数的时候会报出 TypeError: object() takes no parameters 。

参考了:StackOverflow 上的帖子

from flask import current_app

from utils import SHA256
from orm.user import User


class UserInfo(object):
    ''' 
    用户基本信息修改类功能
    '''

    def __new__(cls, **kwargs):
        userid = kwargs.get('id')
        name = kwargs.get('name')
        uid_list = current_app.config.get('USER_ID_LIST')
        uname_list = current_app.config.get('USER_NAME_LIST')
        if userid in uid_list or name in uname_list:
            return object.__new__(cls)
        return None

    def __init__(self, **kwargs):
        uid = kwargs.get('id')
        name = kwargs.get('name')

        if uid:
            obj = User.query.filter_by(id=uid).first()
        elif name:
            obj = User.query.filter_by(name=name).first()
        self.obj = obj 
        self.user_id = obj.id
        self.user_name = obj.name

    def set_pwd(self, pwd):
        self.obj.passwd = SHA256(pwd)
        self.obj.update()
2824 次点击
所在节点    Python
3 条回复
hugo775128583
2016-11-28 14:19:41 +08:00
class A(object):
def __new__(cls, i, j):
print(cls, i, j)
return object.__new__(cls)

def __init__(self, x, y):
print(self, x, y)
self.x = x
self.y = y

Python3 中 __new__ 和 __init__ 方法接受的参数必须是一样的。

lz 可以试试参数不一样的情况。
hugo775128583
2016-11-28 14:21:32 +08:00
format 一蛤

```python
class A(object):
def __new__(cls, i, j):
print(cls, i, j)
return object.__new__(cls)

def __init__(self, x, y):
print(self, x, y)
self.x = x
self.y = y
```

Python3 中 __new__ 和 __init__ 方法接受的参数必须是一样的。

lz 可以试试参数不一样的情况
mgna17
2016-11-28 14:49:45 +08:00
@hugo775128583 无效,用 return object.__new__(cls) 的话参数不同基本上就是 __init__ 无法接收这些参数,一旦在 return object.__new__(cls) 时添加更多的参数,就会报 object() takes no parameters

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/323815

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX