Cũng cho phép bạn làm điều này: (trong ngắn hạn, gọi Outer(3).create_inner_class(4)().weird_sum_with_closure_scope(5)
sẽ trả lại 12, nhưng sẽ làm như vậy theo cách điên rồ nhất.
class Outer(object):
def __init__(self, outer_num):
self.outer_num = outer_num
def create_inner_class(outer_self, inner_arg):
class Inner(object):
inner_arg = inner_arg
def weird_sum_with_closure_scope(inner_self, num)
return num + outer_self.outer_num + inner_arg
return Inner
Tất nhiên, điều này khó tưởng tượng hơn trong các ngôn ngữ như Java và C #. Bằng cách làm cho tham chiếu tự rõ ràng, bạn có thể tự do tham khảo bất kỳ đối tượng nào bằng cách tự tham chiếu đó. Ngoài ra, cách chơi với các lớp trong thời gian chạy như vậy khó thực hiện hơn trong các ngôn ngữ tĩnh hơn - không nhất thiết phải tốt hay xấu. Chỉ là bản thân rõ ràng cho phép tất cả sự điên rồ này tồn tại.
Hơn nữa, hãy tưởng tượng điều này: Chúng tôi muốn tùy chỉnh hành vi của các phương thức (để định hình hoặc một số phép thuật đen điên rồ). Điều này có thể khiến chúng ta suy nghĩ: nếu chúng ta có một lớp Method
mà hành vi chúng ta có thể ghi đè hoặc kiểm soát thì sao?
Vâng, đây là:
from functools import partial
class MagicMethod(object):
"""Does black magic when called"""
def __get__(self, obj, obj_type):
# This binds the <other> class instance to the <innocent_self> parameter
# of the method MagicMethod.invoke
return partial(self.invoke, obj)
def invoke(magic_self, innocent_self, *args, **kwargs):
# do black magic here
...
print magic_self, innocent_self, args, kwargs
class InnocentClass(object):
magic_method = MagicMethod()
Và bây giờ: InnocentClass().magic_method()
sẽ hành động như mong đợi. Phương thức sẽ được liên kết với innocent_self
tham số đến InnocentClass
và với magic_self
đối tượng MagicMethod. Lạ nhỉ? Giống như có 2 từ khóa this1
và this2
trong các ngôn ngữ như Java và C #. Phép thuật như thế này cho phép các khung công tác thực hiện những thứ mà nếu không thì sẽ dài dòng hơn nhiều.
Một lần nữa, tôi không muốn bình luận về đạo đức của công cụ này. Tôi chỉ muốn thể hiện những điều khó thực hiện hơn nếu không có tài liệu tham khảo rõ ràng.
self
để truy cập các thành viên - stackoverflow.com/questions/910020/ợi