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

com*_*mte 10 python oop class

目前我有类似的东西

if name and password:
     user = User(name, password)
     ...do stuff
Run Code Online (Sandbox Code Playgroud)

我想重构一下:

user = User(name, password)
if user:
     ...do stuff
Run Code Online (Sandbox Code Playgroud)

我创建了一个User()类:

class User():
    def __init__(self, name, password):
        if name and password:
            self.name, self.password = name, password
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,即使name或者passwordNone,user仍然被实例化(空,但仍然存在,所以if user:测试为真).

如何将我不会实例基于特定参数的对象?

Mar*_*ers 21

你必须使用一种__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
Run Code Online (Sandbox Code Playgroud)

但是,你违反了期望; 当你打电话给一个班级时,我希望总能得到一个新的实例.提出异常,或使用类方法.

提出例外:

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
Run Code Online (Sandbox Code Playgroud)

或使用类方法:

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
Run Code Online (Sandbox Code Playgroud)