[英]Prevent a function from becoming an instancemethod in Python 2
我正在编写一些适用于Python 3但不适用于Python 2的代码。
foo = lambda x: x + "stuff"
class MyClass(ParentClass):
bar = foo
def mymethod(self):
return self.bar(self._private_stuff)
我希望它只是打印私人的东西,但如果我尝试运行mymethod,我得到:
TypeError: unbound method <lambda>() must be called with MyClass instance as first argument (got str instance instead)
当然,上面不是实际的代码,而是真实的简化。 我想这样做是因为我需要传递我不想将最终用户公开的私人信息,即扩展我的类的任何人。 但是在Python 2中,全局级lambda(或任何普通函数)成为一种instancemethod
,在这种情况下这是不需要的!
您建议我将这段代码移植到什么位置?
最简单的:
class MyClass(ParentClass):
bar = staticmethod(foo)
其余代码保持不变。 虽然staticmethod
最常用作“装饰器”,但没有要求这样做(因此,不需要进一步的间接级别来使bar
成为调用foo
的装饰方法)。
我会选择Alex Martelli的建议。 但是,仅仅为了记录,(我在看到Alex Martelli的漂亮答案之前写了这个答案)你也可以在Python 2.7和3.x中做到以下几点(特别注意我提供的文档链接,以便你了解发生了什么) ):
您可以使用静态方法 ,它不会期望隐含的第一个参数。 请注意, lambda表达式不能使用语句 ,因此您将无法在2.x中的lambda
函数中使用print
语句。
foo = lambda x: x # note that you cannot use print here in 2.x
class MyClass(object):
@staticmethod # use a static method
def bar(x):
return foo(x) # or simply print(foo(x))
def mymethod(self):
return self.bar(1)
>>> m = MyClass()
>>> m.mymethod()
1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.