我想知道是否可以使用setattr将属性设置为类中的方法,因为当我尝试时,我会得到一个错误,该错误将在代码后显示:
class Test:
def getString(self, var):
setattr(self.getString, "string", var)
return self.getString
test = Test()
test.getString("myString").string
Run Code Online (Sandbox Code Playgroud)
哪个错误AttributeError: 'method' object has no attribute 'string'所以我尝试了它没有放.string,只是尝试了test.getString("myString")相同的错误,但后来我尝试了没有像这样使用类
def getString(var):
setattr(getString, "string", var)
return getString
getString("myString").string
Run Code Online (Sandbox Code Playgroud)
它像我想要的那样返回"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"
Run Code Online (Sandbox Code Playgroud)
另一种是使用函数对象:
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
Run Code Online (Sandbox Code Playgroud)