我想做这样的事情:
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
效果很好。
答案 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不再是可调用的。