2012-06-29 15 views
14

Tôi có một lớp vectơ và tôi đã xác định phương thức __mul__ để nhân một véc tơ với một số.Xác định bí danh phương thức trong Python?

Đây là __mul__ phương pháp:

def __mul__(self, other): 
    x = self.x * other 
    y = self.y * other 
    new = Vector() 
    new.set_pos((x, y)) 
    return new 

Vấn đề của tôi là tôi không biết đó là đó giữa số và vector. Nếu tự là số, self.x sẽ gây ra lỗi. (Tôi có thể nhầm lẫn ở điểm này: là "khác" luôn là một số)

Vì vậy, tôi tìm thấy ở đây: Python: multiplication override rằng tôi có thể làm:

__rmul__ = __mul__ 

nhưng làm thế nào tôi có thể làm điều đó trong một lớp định nghĩa?

Cái gì như:

def __rmul__ = __mul__ 

Trả lời

18

self sẽ không bao giờ có số lượng trong __mul__() vì đối tượng phương pháp này được gắn vào không phải là số, đó là vector, và theo định nghĩa nó phép nhân.

other sẽ là số nếu đối tượng của bạn đang được nhân với một số. Hoặc nó có thể là một cái gì đó khác, chẳng hạn như một vector khác, mà bạn có thể kiểm tra và xử lý.

Khi đối tượng của bạn là số nhân, __rmul__() được gọi nếu bội số không biết cách xử lý thao tác.

Để xử lý trường hợp trong đó __mul____rmul__ phải là cùng một phương pháp, vì thao tác này là giao hoán, bạn chỉ có thể thực hiện nhiệm vụ trong định nghĩa lớp học của mình.

class Vector(object): 
    def __mul__(self, other): 
     pass 

    __rmul__ = __mul__ 
9

Đơn giản chỉ cần liệt kê nó như là một thuộc tính:

__rmul__ = __mul__ 

Đây là giống như cách bạn muốn tạo một bí danh của một hàm trong một mô-đun; việc tạo một bí danh của một phương thức trong một lớp cơ thể hoạt động giống nhau.

3

Vấn đề là trong Python, bạn có thể nói cho các đối tượng biết cách nhân lên bằng mọi thứ. Điều đó có nghĩa rằng

a * b 

có thể một trong hai trung bình "nói a để nhân bản thân bằng cách b" hoặc "nói b để nhân bản thân bằng cách a". Trong mã, mà dịch để

a.__mul__(b) 

hoặc

b.__rmul__(a) 
+0

Có cách nào để biết người nào sẽ được gọi? –

+1

'__mul__' trước, sau đó' __rmul__' nếu điều đó không thành công. – katrielalex

+3

tốt hơn: hoặc "yêu cầu b nhân một (b)". Toán tử nhân không cần phải giao hoán. – glglgl