有哪些方法可以为类中的参数实现条件条目?

这是我的意思的一个例子,请参加以下类(class):

class Person(object):
    def __init__(self, name, gender, age):

        self.name = name
        self.gender = gender
        self.age = age

    def get_name(self):
        return self.name

    def get_gender(self):
        return self.gender

    def get_age(self):
        return self.age

在上述情况下,仅当 name、gender 和 age 的参数分别为 strstrint 类型时,我才希望从 Person 类创建一个对象。

换句话说,如果我输入:
bill = person('Bill McFoo', 'Male', '20')

对象 bill 不会被创建,因为年龄是一个字符串而不是一个整数。

这是我的方法;我在 if 方法中包含了一个 __init__ 语句:
def __init__(self, name, gender, age):

    self.name = name

    if isinstance(age, str):
        print("Age needs to be an integer you f**king idiot!")
        raise ValueError
    else:
        self.age = age

    self.gender = gender

所以在上面的例子中,参数 age 的输入被检查它是一个整数,如果不是,那么它会斥责用户并引发一个阻止对象被创建的异常。我可以对 namegender 执行相同的操作,并使用 isinstance 检查它们是否是字符串。

所以我想知道是否有更简单或“正确”的方法来为类实现这样的参数检查,而不是我所做的方法?

最佳答案



正确的方法是根本不检查任何东西。在 Python 中,您假设对象知道当您向它们询问事物时该做什么,然后在出现问题时捕获异常。

如果您 必须 那么您尝试将对象转换为您期望的类型,然后捕获异常:

try:
   age = int(age)
except ValueError:
   # do something
   raise

或者很简单,如果您只是要重新引发异常 - 您不需要捕获它:
self.age = int(age)

现在,如果 age 不是可以转换为整数的东西,并且由于您没有异常处理程序,Python 将引发异常 - 默认异常处理程序将捕获异常并停止程序的执行。

这种范式称为 EAFP :



此外,您不需要 Python 中的“getter/setter”方法。所以你可以摆脱 get_name 等,直接访问属性。

关于python - 类中参数的条件或限制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33194412/

10-11 09:03
查看更多