访问未定义的方法

时间:2017-03-14 18:31:22

标签: python getattr

我想在python类中对未定义的方法或属性调用进行一些处理。如果if方法不存在,则需要执行某项任务。在这个例子中我写了一些方法和一些调用。

我想要实现的是,如果在类中没有定义任何调用,它将转到__getattr__,并且我想在那里检查一个方法名称" get_ {the_called_method_or_attribute}& #34;是否存在。如果存在,只需调用方法并返回其值。

我尝试使用dirself__dict__等,但没有效果。它只是在递归中称自己。

有没有办法通过不检查调用部分中的方法或属性的存在而不是在类内部来执行我的查询?

class C:

    def __init__(self, data):
        self.data = data

    def get_name(self):
        return "{f_name} {l_name}".format(**self.data)

    def get_f_name(self):
        return data.get("f_name")

    def get_l_name(self):
        return data.get("l_name")

    def get_email(self):
        return data.get("email")

    def access_undefined_methods(self, key):
        return self.data.get(key, "Key '{}' does not present".format(key))

    def __getattr__(self, name):
        return self.access_undefined_methods(name)

data = {"f_name": "John", "l_name": "Doe", "email": "john@doe.com"}
obj = C(data)
print obj.get_name()    # <-- John Doe
print obj.f_name        # <-- John
print obj.l_name        # <-- Doe
print obj.email         # <-- john@doe.com
print obj.name          # <-- this should execute obj.get_name()

1 个答案:

答案 0 :(得分:0)

您可以使用get_XXX函数来检查dir()方法是否存在,以获取对象方法的字典。

def access_undefined_methods(self, name):
    if 'get_' + name in dir(self):
        return dir(self)['get_' + name'])(self)
    else:
        return "Key '{}' does not present".format(key)