目前我有类似的东西
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
或者password
是None
,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)