Как я могу создать экземпляр класса, только если переданный аргумент является строкой? - PullRequest
1 голос
/ 17 мая 2019

Я создал класс 'Stage' и хочу создать его экземпляр, только если аргумент передан init (arg)

#example code

class Stage:
    def __init__(self, arg):
        if type(arg) == str:
            #create object
        else:
            #do not create object

#main:
# entry = input()

obj = Stage(entry)

if obj:
    print("created")         # if entry is string
else:
    print("not created")     # if entry is float

Ответы [ 4 ]

2 голосов
/ 17 мая 2019

Вызовите исключение:

def __init__(self, arg):
    if not isinstance(arg, str):
        raise TypeError("Stage.__init__ called with a non-str value: %r" % (arg,))

    # continue initializing the object

Однако, подумайте, действительно ли это значение должно быть a str или просто чем-то, что можно превратить в str:

def __init__(self, arg):
    arg = str(arg)
    # ...

Если вы хотите избежать создания экземпляра в целом, вам необходимо переопределить __new__, а не __init__ (с некоторыми предыдущими советами):

class Stage:
    def __new__(cls, arg):
        try:
            arg = str(arg)
        except ValueError:
            raise TypeError("Could not convert arg to str: %r" % (arg, ))

        return super().__new__(cls, arg)
1 голос
/ 17 мая 2019

Вы не можете инициализировать объект с этим условием, но вы можете выдать ошибку

class Stage:
    def __init__(self, arg):
        if not isinstance(arg, str):
            raise TypeError("non-str value: %r was passed, str type argument required " % (arg,))
1 голос
/ 17 мая 2019

Проверьте тип аргумента перед созданием экземпляра вашего объекта. Также рассмотрите возможность использования isinstance для проверки типа вместо type

class Stage:
    def __init__(self, arg):
       pass

if isinstance(str, entry):
    obj = Stage(entry)
else:
    raise TypeError('A str-type is required as an argument to the constructor')
0 голосов
/ 17 мая 2019

Вы также можете использовать classmethod для создания экземпляра, только если переданное значение является строкой:

class Stage:
  def __init__(self, val):
    self.val = val
  @classmethod
  def stage(cls, arg):
    return None if not isinstance(arg, str) else cls(arg)

s = Stage.stage("name")

Теперь s будет либо экземпляром Stage, если arg - строка, либо None, если arg - это любой другой тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...