Tuyên bố từ chối Đây chỉ là một bài tập trong lập trình meta, nó không có mục đích thực tế .Xác định __getattr__ và __getitem__ trên một hàm không có hiệu lực
tôi đã gán __getitem__
và __getattr__
phương pháp trên một đối tượng chức năng, nhưng không có hiệu lực thi hành ...
def foo():
print "foo!"
foo.__getitem__ = lambda name: name
foo.__getattr__ = lambda name: name
foo.baz = 'baz'
Sanity kiểm tra xem chúng tôi có thể gán thuộc tính cho một chức năng:
>>> foo.baz
'baz'
Gọn gàng. Làm thế nào về "getters ma thuật"?
>>> foo.bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'bar'
>>> foo['foo']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'function' object is not subscriptable
>>> getattr(foo, 'bar')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'bar'
Có thể có "ma thuật getter" trên đối tượng chức năng không?
@kindall chỉ ra điều này bên dưới, nhưng tôi sẽ đề cập đến nó ở đây để nó ở lại với câu trả lời. các lớp kiểu mới không sử dụng độ phân giải phương thức "bình thường" với '__getattr__' và bạn bè của nó. 'a.foo' được dịch nội bộ thành' type (a) .__ getattr __ ('foo') '. Vì vậy, thuộc tính '__getattr__' được lưu trữ trong' a .__ dict__' không được tìm thấy. Hy vọng rằng có ý nghĩa ...: -/ – colinta