2015-09-27 13 views
9

tôi đã cố gắng để xác định một lớp và ghi đè lên các nhà điều hành dấu ngã:Có khả năng ghi đè lên toán tử đơn nhất bằng toán tử nhị phân trong Python không?

class foo: 
    def __invert__(self, other) 
     return 1232 # a random number , just as test 

Sau đó gọi nó thích:

>>> f = foo() 
>>> g = foo() 
>>> f ~ g 
    File "<input>", line 1 
    f ~ g 
    ^
SyntaxError: invalid syntax 

Chúng ta có thể thay thế các nhà điều hành dấu ngã với một nhị phân vì vậy chúng tôi có thể làm phẫu thuật như f ~ g mà không gây ra lỗi cú pháp.

+4

Không, không có. –

+0

Không phải không sửa đổi chính Python, không (mặc dù bạn có thể làm như vậy nếu bạn muốn - xem ví dụ: http://stackoverflow.com/questions/214881/can-you-add-new-statements-to-pythons-syntax để giới thiệu). – jonrsharpe

+0

@jonrsharpe: và thậm chí sau đó, số lượng toán hạng bằng cách thay đổi * tại thời gian chạy * như thế nào? Lựa chọn duy nhất của bạn là thay đổi toán tử '~' có nghĩa là hoàn toàn, bạn không thể chọn giữa 1 hoặc 2 toán hạng khi chạy. –

Trả lời

11

Không, bạn không thể làm điều đó, không phải mà không thay đổi hoàn toàn cách Python biên dịch bytecode. Tất cả các biểu thức đầu tiên là được phân tích cú pháp thành một cây cú pháp trừu tượng, sau đó được biên dịch thành bytecode từ đó và ở giai đoạn phân tích cú pháp toán hạng và toán tử được nhóm lại.

Khi thời gian bytecode chạy bạn không còn có thể quyết định chấp nhận hai toán hạng.

Các vấn đề liên quan