Python - 存在一个在对象未实现函数时调用的函数?

时间:2009-11-30 14:31:48

标签: python oop function

在Smalltalk中,有一条消息DoesNotUnderstand在对象不理解消息时被调用(这是当对象没有发送消息时)。

所以,我想知道在python中是否有一个函数可以做同样的事情。

在这个例子中:

class MyObject:
    def __init__(self):
        print "MyObject created"

anObject = MyObject() # prints: MyObject created
anObject.DoSomething() # raise an Exception

那么,我可以向MyObject添加一个方法,以便知道何时有DoSomething被调用?

PS:抱歉我的英语不好。

4 个答案:

答案 0 :(得分:7)

以下是您想要做的事情:

class callee:
    def __init__(self, name):
        self.name = name

    def __call__(self):
        print self.name, "has been called"


class A:
    def __getattr__(self, attr):
        return callee(attr)

a = A()

a.DoSomething()
>>> DoSomething has been called

答案 1 :(得分:3)

您正在寻找__getattr__方法。看看here

如果您想要一个班级的“完全控制”,请查看__getattribute__特殊方法,然后(here)。

答案 2 :(得分:3)

您是否查看了对象。__getattr__(self, name)或对象。__getattribute__(self, name)的新式类? (见Special method names, Python language reference

答案 3 :(得分:2)

我不知道为什么卢克有两个单独的课程。如果使用闭包,可以使用一个类完成所有操作。像这样:

class A(object):
    __ignored_attributes__ = set(["__str__"])

    def __getattr__(self, name):
        if __name__ in self.__ignored_attributes__:
            return None

        def fn():
            print name, "has been called with self =", self

        return fn

a = A()
a.DoSomething()

我添加了关于__ignored_attributes__的内容,因为Python在课堂上查找__str__并且有点乱。