检查成员变量是否由构造函数初始化?

时间:2019-08-02 06:00:02

标签: python class

嗨,我只是在想如何设计它,所以我有一个成员函数,该函数依赖于成员函数是否已初始化。我目前正在做的事情如下

class Foo:
def __init__(self, param = None):
    if param :
        self.has_param = True
        self.param = some_value
    else:
        self.has_param = False

def bar(self): % function that uses param
    if not self.has_param:
        raise Exception('param not set')

def bar2(self): % function that doesn't use param
    pass

我搜索并搜索了SO,但似乎什么也没有敲响。这足够Pythonic吗?还是有其他方法可以直接检查self.param是否存在? 谢谢。

编辑:评论中的一些新想法

class Foo:
    def __init__(self, param = None):
        self.param = param

    def bar(self):
        if not hasattr(self, param):
            raise Exception('param not set')

或者我可以做到这一点,

class Foo:
    def __init__(self, param = None):
        self.param = param

    def bar(self):
        if not self.param:
            raise Exception('param not set')

2 个答案:

答案 0 :(得分:1)

您还可以使用tryexcept和正常失败

答案 1 :(得分:1)

也许您可以尝试以下方法:

class Foo:
    def __init__(self, param = None):
        self.param = param

    def __getattribute__(self, key):
        value = super().__getattribute__(key)
        if value is None:
            raise AttributeError(f'Attribute "{key}" not set')
        return value

    def bar(self):
        myparam = self.param

Foo(param='Hello world').bar() # OK
Foo().bar() # Error: Attribute "param" not set