有没有办法可以动态添加属性到python方法?

时间:2016-02-29 15:19:54

标签: python

我想做这样的事情:

class Foo:
    def test(self, arg):
        self.test.x = 'prop x with ' + arg
        print "test!"

f = Foo()
f.test('bar')
print f.test.x

得到像这样的输出:

test!
prop x with bar

但我获得AttributeError: 'instancemethod' object has no attribute 'x'

顺便说一句,我可以用功能来做这件事:

def test(arg):
    test.x = 'prop x ' + arg
    print "test!"

test('bar')
print test.x

效果很好。

4 个答案:

答案 0 :(得分:2)

你不能这样做;即使你可以,方法也是类的属性,而不是实例,因此将为所有Foo实例设置相同的值。

相反,您应该直接分配给实例。您可以添加自己喜欢的任何属性。

SELECT question_id
     , AVG(diff) avg_diff 
  FROM 
     ( SELECT x.user_id
            , x.question_id
            , TIME_TO_SEC(TIMEDIFF(MAX(y.data_time),x.data_time)) diff 
         FROM survey_reply x 
         JOIN survey_reply y 
           ON y.user_id = x.user_id 
          AND y.data_time < x.data_time 
        GROUP 
           BY x.user_id
            , x.question_id
     ) a
 GROUP 
    BY question_id;

答案 1 :(得分:2)

即使您成功设置了该属性,也不会保留该属性。在CPython中,绑定方法是在您访问它们时动态创建的:

>>> class Foo:
...   def test(self, arg): pass
... 
>>> f = Foo()
>>> f.test is f.test
False

答案 2 :(得分:1)

您可以将成员添加到类实例,但不能添加到方法。

class Foo:
  def test(self, arg):
    self.x = 'prop x with ' + arg
    print "test!"

f = Foo()
f.test('bar')
print f.x

答案 3 :(得分:1)

我们可以通过litle tweaking来达到/实现你想要的东西

from collections import namedtuple

T = namedtuple('T', ['x'])

class Foo:
    def test(self, arg):
        self.test = T('prop x with ' + arg)
        print "test!"

f = Foo()
f.test('bar')
print f.test.x

输出将是:

test!
prop x with bar

注意

我称之为调整的原因是,从这一点来说,f.test不再是可调用的。