如何创建一个仅在满足特定条件时才进行实例化的类?

2024-04-23 15:23:19 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一节课:

class Person:
    def __init__(self, name):
        self.name = name

如果我想实例化Person,我可以:

me = Person("António")

但是如果我只想实例化Person如果name的类型是str呢?
我试过这个:

class Person:
    def __init__(self, name):
        if type(name) == str:
            self.name = name

但当我这么做的时候:

me = Person("António")
print(me.name)

you = Person(1)
print(you.name)

我明白了:

enter image description here

所以现在发生的是:

  • 如果namestr,则实例有一个.name方法
  • 如果name不是str,则实例没有.name方法

但我真正想要的是,如果名称不是str,就停止实例化 换句话说,我希望不可能从Person类中创建具有非strname的对象。你知道吗

我该怎么做?你知道吗


Tags: 实例方法nameselfyouinitdefclass
3条回答

怎么样:

class Person:
    def __init__(self, name):
        if type(name) == str:
            self.name = name
        else: 
            raise Exception("name attribute should be a string")

您可以使用工厂检查参数,如果一切正常或出现错误,则返回Person对象:

也许是这样的:

class PersonNameError(Exception):
    pass

class Person:
    def __init__(self):
        self.name = None

def person_from_name(name: str) -> Person:
    """Person factory that checks if the parameter name is valid
    returns a Person object if it is, or raises an error without 
    creating an instance of Person if not.
    """
    if isinstance(name, str):
        p = Person()
        p.name = name
        return p
    raise PersonNameError('a name must be a string')

p = person_from_name('Antonio') 

鉴于:

p = person_from_name(123)   # <  parameter name is not a string

引发异常:

PersonNameError                           Traceback (most recent call last)
<ipython-input-41-a23e22774881> in <module>
     14 
     15 p = person_from_name('Antonio')
 -> 16 p = person_from_name(123)

<ipython-input-41-a23e22774881> in person_from_name(name)
     11         p.name = name
     12         return p
 -> 13     raise PersonNameError('a name must be a string')
     14 
     15 p = person_from_name('Antonio')

PersonNameError: a name must be a string

您应该使用factory design pattern。您可以阅读更多关于它的信息here。简单来说:

创建将检查条件的类/方法,并仅在满足这些条件时返回新的类实例。你知道吗

相关问题 更多 >