我想知道是否可以使用setattr将属性设置为类中的方法,因为当我尝试时,我会得到一个错误,该错误将在代码后显示:
class Test: def getString(self, var): setattr(self.getString, "string", var) return self.getString test = Test() test.getString("myString").string
哪个错误AttributeError: 'method' object has no attribute 'string'
所以我尝试了它没有放.string
,只是尝试了test.getString("myString")
相同的错误,但后来我尝试了没有像这样使用类
def getString(var): setattr(getString, "string", var) return getString getString("myString").string
它像我想要的那样返回"myString",所以我如何在一个类中执行此操作,为什么它在一个外部工作但在一个内部工作?
type( test.getString )
是,builtins.method
并且来自文档(方法),
由于方法属性实际上存储在基础函数对象(
meth.__func__
)上,因此不允许在绑定方法上设置方法属性。尝试在方法上设置属性会导致AttributeError
被引发。
根据要寻找的行为,有(至少)两种可能的解决方案。一种是在类方法上设置属性:
class Test: def getString(self, var): setattr(Test.getString, "string", var) return self.getString test = Test() test.getString("myString").string # > "myString" test2 = Test() test2.getString.string # > this is also "myString"
另一种是使用函数对象:
class Test: class getStringClass: def __call__ ( self, var ): setattr( self, "string", var ) return self def __init__( self ): self.getString = Test.getStringClass( ) test = Test( ) test.getString( "myString" ).string # > "myString" test2 = Test() test2.getString.string # > this is error, because it does not # have the attribute 'string' yet