python – 在类创建后设置方法上的属性会引发“’instancemethod’对象没有属性”但是属性显然存在

python – 在类创建后设置方法上的属性会引发“’instancemethod’对象没有属性”但是属性显然存在,第1张

概述在 Python(2和3)中,我们可以为函数分配属性: >>> class A(object):... def foo(self):... """ This is obviously just an example """... return "FOO{}!!".format(self.foo.bar)... foo.bar = 123.. 在 Python(2和3)中,我们可以为函数分配属性:

>>> class A(object):...     def foo(self):...         """ This is obvIoUsly just an example """...         return "FOO{}!!".format(self.foo.bar)...     foo.bar = 123...>>> a = A()>>> a.foo()'FOO123!!'

这太酷了.

但为什么我们不能在以后更改foo.bar?例如,在构造函数中,如下所示:

>>> class A(object):...     def __init__(self,*args,**kwargs):...         super(A,self).__init__(*args,**kwargs)...         print(self.foo.bar)...         self.foo.bar = 456  # KABOOM!...     def foo(self):...         """ This is obvIoUsly just an example """...         return "FOO{}!!".format(self.foo.bar)...     foo.bar = 123...>>> a = A()123Traceback (most recent call last):  file "<stdin>",line 1,in <module>  file "<stdin>",line 5,in __init__AttributeError: 'instancemethod' object has no attribute 'bar'

Python声称没有任何条形,即使它只是在前一行打印它.

如果我们尝试直接在类上更改它,则会发生同样的错误:

>>> A.foo.bar123>>> A.foo.bar = 345  # KABOOM!Traceback (most recent call last):  file "<stdin>",in <module>AttributeError: 'instancemethod' object has no attribute 'bar'

这里发生了什么,也就是为什么我们看到这种行为?

有没有办法在类创建后设置函数的属性?

(我知道有多种选择,但我明确地想知道这里的方法属性,或者可能是一个更广泛的问题.)

动机:Django利用在方法上设置属性的可能性,例如:

class MyModeladmin(Modeladmin):    ...    def custom_admin_column(self,obj):        return obj.something()    custom_admin_column.admin_order_fIEld ='relation__fIEld__span'    custom_admin_column.allow_Tags = True
解决方法 在类体内设置foo.bar是有效的,因为foo是实际的foo函数.但是,当你这样做的时候

self.foo.bar = 456

self.foo不是那个功能. self.foo是一个实例方法对象,在您访问它时按需创建.您无法在其上设置属性,原因如下:

>如果这些属性存储在foo函数中,则分配给a.foo.bar会对b.foo.bar产生意外影响,这与对属性赋值的所有常规期望相反.
>如果这些属性存储在self.foo实例方法对象中,则下次访问self.foo时它们不会显示,因为下次您将获得一个新的实例方法对象.
>如果这些属性存储在self.foo实例方法对象中并且您更改了规则,那么self.foo始终是同一个对象,那么这会大量膨胀Python中的每个对象以存储一堆您几乎不需要的实例方法对象.
>如果这些属性存储在self .__ dict__中,那么没有__dict__的对象呢?此外,你需要提出某种名称修改规则,或者在self .__ dict__中存储非字符串键,这两者都有自己的问题.

如果要在完成类定义后在foo函数上设置属性,可以使用A .__ dict __ [‘foo’].bar = 456来实现.(我使用A .__ dict__来绕过A是否A的问题.foo是函数或未绑定的方法对象,它取决于你的Python版本.如果A继承foo,你将不得不处理该问题或访问它继承foo的类的dict.)

总结

以上是内存溢出为你收集整理的python – 在类创建后设置方法上的属性会引发“’instancemethod’对象没有属性”但是属性显然存在全部内容,希望文章能够帮你解决python – 在类创建后设置方法上的属性会引发“’instancemethod’对象没有属性”但是属性显然存在所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1197595.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存