我试图使用__getattr__
来处理对象的未定义方法调用。我希望最终结果的行为与Perl中的AUTOLOAD
函数非常相似。
可以使用以下代码完成此操作。
test.py:
#!/usr/bin/python
import Object
# Create an object
object = Object.Object()
# Try and access the "thing" attribute
object.thing
# Try and call the "thing" method
object.thing()
# Call the "thing" method with arguments
object.thing("arg1", "arg2")
Object.py:
class test(object):
"""Class for testing purposes!"""
def __getattr__(self, name):
"""Handle undefined method calls!"""
def __AUTOLOAD(*args):
"""Hack to simulate Perl's AUTOLOAD function."""
# Do something with the args!
return self.f(name, *args)
return __AUTOLOAD
# Simply print the args (as an example)
def f(self, name, *args):
"""Do something with the args!"""
print args
return
输出:
>test.py
()
('arg1', 'arg2')
问题是,我只想让它适用于方法调用。如果它试图访问不存在的属性,我希望脚本抛出异常。
这意味着当我尝试访问""属性我想让它失败,但它应该适用于其他两种情况。
如果我能找到一种方法让Python区分空的tuple ()
和一个完全空的变量,这可能是可行的。正如您所看到的,object.thing
调用没有打印任何内容,因为args
变量不包含任何内容。
有没有办法在Python中捕获这个并在args
变量为COMPLETELY为空并且不仅仅是空元组时引发异常?
答案 0 :(得分:1)
作为一个hacky AUTOLOAD代理,您可以执行以下操作:
class Thing(object):
def __init__(self, default):
self.default = default
def __getattr__(self, name):
try:
return getattr(self.default, name)
except AttributeError:
return self.default
然后使用:
首先定义一个默认函数:
>>> def auto(*args, **kwargs):
>>> print 'default', args, kwargs
然后:
>>> Thing(auto).not_defined()
default () {}
>>> Thing(auto).not_defined(123)
default (123,) {}
>>> Thing(auto).not_defined(123, mu=345)
default (123,) {'mu': 345}
答案 1 :(得分:0)
使用len(args)
计算参数数量:
def f(self, name, *args):
if len(args) == 0:
print "No args"
else:
print "%d args" % len(args)
答案 2 :(得分:-1)
如果args完全为空,那么
args is None == True
所以你只需要比较
args == ().
如果args是一个空元组,它将返回true,如果args为None,则返回false,因为
() is None == False