如果找不到参数,则在__init__中引发异常

时间:2015-12-23 05:58:00

标签: python

我的结构如下:

def __init__(self, my_param): 
    if my_param:
        self.my_param = my_param
    else:
        raise MYException()

我在value=self.my_param

之类的地方使用此值

但是当我没有通过my_param时,它不会引发异常,但会说class object does not have my_param

如何正确抚养?

2 个答案:

答案 0 :(得分:1)

实际上当你没有向你的函数传递一个参数时,引发TypeError异常就是python本身所做的事情,我认为没有必要覆盖这个异常:):

TypeError: __init__() takes exactly 2 arguments (1 given)

但是你也可以使用*args将一个参数元组传递给你的构造函数,以便检查args的有效性,如果你没有传递任何东西,它将传递一个空元组:

class a(object):
    def __init__(self, *args):
        if args:
            self.param = args[0]
        else:
            raise Exception("Please pass a parameter to instance")

另外,作为一种实用而非pythonic方法,您可以使用装饰器来包装构造函数:

def my_exp(func):
    def wrapper(*args, **kwds):
        if args:
            return func(*args)
        else:
            raise Exception("Pleas pass an argument to instance")
    return wrapper()

class a(object):
    @my_exp
    def __init__(self, my_param):
        self.param = my_param

演示:

instance = a()
Traceback (most recent call last):
  File "/home/kasra/Desktop/ex2.py", line 11, in <module>
    class a(object):
  File "/home/kasra/Desktop/ex2.py", line 12, in a
    @my_exp
  File "/home/kasra/Desktop/ex2.py", line 9, in my_exp
    return wrapper()
  File "/home/kasra/Desktop/ex2.py", line 8, in wrapper
    raise Exception("Pleas pass an argument to instance")
Exception: Pleas pass an argument to instance

您还可以使用其他工具,例如functools.wraps等,以便创建更灵活的装饰器。但我仍然建议让python为你完成这项工作!

答案 1 :(得分:0)

这应该有效,

def __init__(self, my_param=None):
    if my_param:
        self.my_param = my_param
    else:
        raise MYException()