[Cập nhật]: Trả lời inline bên dưới câu hỏiDecorator thay đổi trạng thái chức năng từ phương pháp thực hiện chức năng
tôi có một chương trình thanh tra và một mục tiêu là cho logic trong một trang trí để biết xem chức năng nó là trang trí là một phương pháp học hay chức năng thông thường. Điều này đang thất bại một cách kỳ lạ. Dưới đây là mã chạy bằng Python 2.6:
def decorate(f):
print 'decorator thinks function is', f
return f
class Test(object):
@decorate
def test_call(self):
pass
if __name__ == '__main__':
Test().test_call()
print 'main thinks function is', Test().test_call
Sau đó, trên thực:
decorator thinks function is <function test_call at 0x10041cd70>
main thinks function is <bound method Test.test_call of <__main__.Test object at 0x100425a90>>
Bất kỳ manh mối về những gì đang xảy ra sai, và nếu nó là có thể cho @decorate để suy ra một cách chính xác test_call đó là một phương pháp?
[Trả lời] câu trả lời của carl bên dưới gần như hoàn hảo. Tôi đã có một vấn đề khi sử dụng trang trí trên một phương thức mà lớp con gọi. Tôi đã điều chỉnh mã của mình để bao gồm so sánh im_func trên các thành viên của lớp cha:
ismethod = False
for item in inspect.getmro(type(args[0])):
for x in inspect.getmembers(item):
if 'im_func' in dir(x[1]):
ismethod = x[1].im_func == newf
if ismethod:
break
else:
continue
break
+1 vì tôi yêu hackery và bạn đánh tôi với nó. – aaronasterling