目前我有类似
的东西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
但在这种情况下即使name
或password
为None
,user
仍然会被实例化(空但仍然存在,因此if user:
测试是真)。
如何不基于特定参数实例化对象?
答案 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)