如果构造函数参数无效,如何返回None

时间:2014-08-08 09:57:49

标签: python class oop

目前我有类似

的东西
if name and password:
     user = User(name, password)
     ...do stuff

我想重构一下:

user = User(name, password)
if user:
     ...do stuff

我创建了一个User()类:

class User():
    def __init__(self, name, password):
        if name and password:
            self.name, self.password = name, password

但在这种情况下即使namepasswordNoneuser仍然会被实例化(空但仍然存在,因此if user:测试是真)。

如何基于特定参数实例化对象?

2 个答案:

答案 0 :(得分:19)

您必须使用__new__方法;当__init__被调用时,新实例已经已经创建。

class User(object):
     def __new__(cls, name, password):
         if name and password:
             instance = super(User, cls).__new__(cls)
             instance.name, instance.password = name, password
             return instance

然而,你违反了期望;当你打电话给一个班级时,我希望总是获得一个新的实例。要么提出异常,要么使用类方法。

提出例外:

class User(object):
    def __init__(self, name, password):
        if not (name and password):
            raise ValueError('Empty name or password not allowed')
        self.name, self.password = name, password

try:
    user = User(name, password)
except ValueError:
    # oops, no username or password
else:
    # ...do stuff

或使用classmethod

class User(object):
    def __init__(self, name, password):
        self.name, self.password = name, password

    @classmethod
    def create_valid_user(cls, name, password):
        """Create a user, or return None if conditions are not met"""
        if not (name and password):
            return None
        return cls(name, password)

user = User.create_valid_user(name, password)
if user is not None:
    # ...do stuff

答案 1 :(得分:1)

错误的方式。您应该在名为check()的User类中添加一个方法。或者(更好的方法),创建一个静态方法createUser(名称,密码)。它看起来像:

user = User.createUser(name, password)