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

 mobiledu2502889283 发布于 2023-02-13 16:55

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

1 个回答
  • 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
    

    2023-02-13 16:59 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有