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

Я создал класс '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 ответа


Возбудить исключение:

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

Однако, подумайте, действительно ли это значение должно быть 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)

Проверьте тип аргумента перед созданием экземпляра вашего объекта. Также рассмотрите возможность использования 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')

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

class Stage:
    def __init__(self, arg):
        if not isinstance(arg, str):
            raise TypeError("non-str value: %r was passed, str type argument required " % (arg,))

Вы также можете использовать 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 - любой другой тип.


Есть идеи?

10000