>>> 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’对象没有属性”但是属性显然存在所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)