只允许函数作为Python中的方法调用

时间:2015-03-04 16:57:28

标签: python python-3.x module namespaces

假设我正在编写一个使用另一个内置模块的模块MyPyLib。从内置模块,我导入一个类,Foo。然后我定义了这个函数,bar:

def bar(self):
    return self

这个函数被编写为Foo类的一个方法,我可以用setattr(Foo,'bar', bar)使它正常运行。然后Foo.bar()将按预期工作。但是,任何导入MyPyLib的人也可以将bar作为自己的函数调用。有没有办法限制此功能,以便Foo.bar()有效,但bar(arg)不起作用?

2 个答案:

答案 0 :(得分:2)

您的代码不应该关心错误使用,这对调用者来说是个问题。 Python是同意成人的语言;如果有人想弯曲规则并使用bar使用不同的论点,那就是他们的问题,而不是你的问题。

如果您坚持,此处唯一的选择是明确测试self的类型:

def bar(self):
    assert isinstance(self, Foo)
    return self

因为bar无法检测到它被称为绑定方法或未绑定使用。

答案 1 :(得分:0)

另一种(更通常的)方法是从类Foo派生一个新类,并明确定义bar作为新类的方法:

class FooBar(Foo):
    def bar(self):
        return self

这样bar的预期用法就更清晰了。