Нет причин для создания экземпляра объекта со всеми полями, для которых установлено значение Нет.Я бы сделал несколько проверок на __init__
, например, так:
class PhoneNumber:
def __init__(self, number_raw):
number = int(number_raw) # do not catch exception here, catch it on instantiation
number_str = str(number) # parse to str for slicing
self.areaCode = number_str[0:3] # note no space around slicing indexes
self.exchange = number_str[3:6]
self.line = number_str[6:13]
Также стоит отметить, что используются переменные, подобные PEP-8, поэтому используйте area_code
вместо areaCode
.
Второй способ (с использованием classmethod)
Если вам по каким-либо причинам необходимо вернуть None
, вы можете найти полезную реализацию с использованием classmethod, например:
class PhoneNumber:
def __init__(self, number_raw):
self.areaCode = number_raw[0:3]
self.exchange = number_raw[3:6]
self.line = number_raw[6:13]
@classmethod
def instantiate_with_checks(cls, number_raw):
try:
int(number_raw)
except ValueError:
return None
# after ensuring that provided variable is valid
return cls(number_raw)
Создать новый PhoneNumber
объект, подобный этому: PhoneNumber.instantiate_with_checks(number_raw)
.
Третий способ (с использованием __new__
):
class PhoneNumber:
def __init__( self, number_raw ):
self.area_code = number[0:3]
self.exchange = number[3:6]
self.line = number[6:13]
@classmethod
def is_number_valid(cls, number_raw):
try:
int(number_raw)
except ValueError:
return False
return True
def __new__(cls, number_raw):
if cls.is_number_valid(number_raw):
return super().__new__(cls)