Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 访问未定义的方法_Python_Getattr - Fatal编程技术网

Python 访问未定义的方法

Python 访问未定义的方法,python,getattr,Python,Getattr,我想在python类中处理未定义的方法或属性调用。如果方法不存在,则需要执行某些任务。在这个示例中,我编写了一些方法和一些调用 我想要实现的是,如果类中没有定义任何调用,它将转到\uuuu getattr\uuuu,在那里我想检查名为“get_{the_called_method\u或_attribute}”的方法是否存在。如果存在,只需调用该方法并返回其值 我试着使用dir、self\uu dict\uuuu和其他工具,但没有一个奏效。它只是在递归中调用自己 有没有办法通过不检查调用部分而不是

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

我想要实现的是,如果类中没有定义任何调用,它将转到
\uuuu getattr\uuuu
,在那里我想检查名为“get_{the_called_method\u或_attribute}”的方法是否存在。如果存在,只需调用该方法并返回其值

我试着使用
dir
self\uu dict\uuuu
和其他工具,但没有一个奏效。它只是在递归中调用自己

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

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()
C类:
定义初始化(自身,数据):
self.data=数据
def get_名称(自身):
返回“{f_name}{l_name}”。格式(**self.data)
def get_f_名称(自身):
返回数据。获取(“f_名称”)
def get_l_名称(自身):
返回数据。获取(“l_名称”)
def get_电子邮件(自我):
返回数据。获取(“电子邮件”)
def access_undefined_方法(self,key):
返回self.data.get(键,“键{}”不存在)。格式(键))
def _ugetattr _;(self,name):
返回self.access\u未定义的\u方法(名称)
数据={“f_name”:“John”,“l_name”:“Doe”,“email”:john@doe.com"}
obj=C(数据)

print obj.get_name()#通过使用
dir()
函数获取对象方法的字典,可以检查
get_XXX
方法是否存在

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)

你能解释一下你为什么要这样做吗?我怀疑这是一个错误,我认为这样做太神奇了。你能解释一下你想要实现什么吗?也许有另一种解决办法。实际上没有问题要解决。我只是想知道这是否可行。如果我在调用期间检查了方法的存在性,这是可能的。但是有了这个代码设置,我无法执行。所以我在这里提出了一个问题。我的问题仍然是,这可能吗?你试过代码了吗?还是你读了我的问题?我说使用
dir
不起作用。输出是
文件“test.py”,第78行,在\uuuu getattr\uuuuu返回self.access\u未定义的方法(名称)文件“test.py”中,第72行,在access\u未定义的方法中,如果'get\uu'+dir(self)中的名称:文件“test.py”,第78行,在\uu getattr\uu返回self.access\u未定义的方法(名称)文件“test.py”,第72行,在access\u undefined\u方法中,如果'get\u'+目录中的名称(self):运行时错误:调用Python对象时超出了最大递归深度'