Trong câu hỏi trước, trong nhận xét, tôi đã biết rằng trong python __code__
atrribute của hàm có thể thay đổi. Do đó tôi có thể viết mã như sauTại sao __code__ cho hàm (Python) có thể thay đổi
def foo():
print "Hello"
def foo2():
print "Hello 2"
foo()
foo.__code__ = foo2.__code__
foo()
Output
Hello
Hello 2
tôi đã cố gắng googling, nhưng một trong hai vì không có thông tin (Tôi rất nghi ngờ điều này), hoặc từ khóa (__code__
) là không thể tìm kiếm một cách dễ dàng , Tôi không thể tìm thấy một trường hợp sử dụng cho việc này.
Nó không có vẻ như "bởi vì hầu hết mọi thứ bằng Python là có thể thay đổi" là một câu trả lời hợp lý, hoặc, bởi vì thuộc tính khác của chức năng - __closure__
và __globals__
- được một cách rõ ràng read-only (từ Objects/funcobject.c):
static PyMemberDef func_memberlist[] = {
{"__closure__", T_OBJECT, OFF(func_closure),
RESTRICTED|READONLY},
{"__doc__", T_OBJECT, OFF(func_doc), PY_WRITE_RESTRICTED},
{"__globals__", T_OBJECT, OFF(func_globals),
RESTRICTED|READONLY},
{"__module__", T_OBJECT, OFF(func_module), PY_WRITE_RESTRICTED},
{NULL} /* Sentinel */
};
Tại sao __code__
có thể ghi trong khi các thuộc tính khác là chỉ đọc?
Bạn không thể ngăn chặn bất kỳ loại 'bất chính' này bằng Python, '__code__' hay không. Hoặc tin tưởng các mô-đun được sử dụng hoặc không sử dụng chúng. – user2864740
Có. Tôi đã thấy rằng thường là như vậy. Nhưng vẫn nghĩ để hỏi. –
Thực hành ngăn xếp an toàn thay vì móc vào các API lạ. – TigerhawkT3