你能在python中为方法设置一个属性吗?

rul*_*ler 8 python python-3.x

我想知道是否可以使用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",所以我如何在一个类中执行此操作,为什么它在一个外部工作但在一个内部工作?

beh*_*uri 5

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)