假设我正在编写一个使用另一个内置模块的模块MyPyLib。从内置模块,我导入一个类,Foo。然后我定义了这个函数,bar:
def bar(self):
return self
这个函数被编写为Foo类的一个方法,我可以用setattr(Foo,'bar', bar)
使它正常运行。然后Foo.bar()
将按预期工作。但是,任何导入MyPyLib的人也可以将bar
作为自己的函数调用。有没有办法限制此功能,以便Foo.bar()
有效,但bar(arg)
不起作用?
答案 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
的预期用法就更清晰了。