2011-10-13 16 views
10

nếu tôi có cái gì đó nhưadd phương pháp để nạp lớp/mô-đun trong python

import mynewclass 

Tôi có thể thêm một số phương pháp để mynewclass? Một cái gì đó như sau trong khái niệm:

def newmethod(self,x): 
    return x + self.y 

mynewclass.newmethod = newmethod 

(Tôi đang sử dụng CPython 2.6)

+1

Có thể sử dụng: http://stackoverflow.com/questions/962962/python-changing-methods-and-attributes-at-runtime –

Trả lời

12

Trong Python câu lệnh import được sử dụng cho mô-đun, không lớp học ... như vậy để nhập khẩu một lớp học mà bạn cần một cái gì đó giống như

from mymodule import MyClass 

Thêm vào điểm của câu hỏi của bạn là câu trả lời là có. Trong các lớp Python chỉ là các đối tượng thường xuyên và một phương thức lớp chỉ là một hàm được lưu trữ trong một thuộc tính đối tượng.

Thuộc tính của đối tượng trong Python hơn nữa là động (bạn có thể thêm thuộc tính đối tượng mới khi chạy) và thực tế này, kết hợp với trước đó có nghĩa là bạn có thể thêm phương thức mới vào lớp khi chạy.

class MyClass: 
    def __init__(self, x): 
     self.x = x 

... 

obj = MyClass(42) 

def new_method(self): 
    print "x attribute is", self.x 

MyClass.new_method = new_method 

obj.new_method() 

Cách này có thể hoạt động? Khi bạn gõ

obj.new_method() 

Python sẽ làm như sau:

  1. nhìn cho new_method bên trong đối tượng obj.

  2. Không tìm thấy nó như là một thuộc tính thể hiện nó sẽ cố gắng tìm kiếm bên trong đối tượng lớp (có sẵn là obj.__class__), nơi nó sẽ tìm thấy hàm.

  3. Bây giờ có một chút thủ đoạn gian trá vì Python sẽ nhận thấy rằng những gì nó tìm thấy là một chức năng và do đó sẽ "quấn" nó trong một đóng cửa để tạo ra những gì được gọi là "phương pháp ràng buộc". Điều này là cần thiết bởi vì khi bạn gọi obj.new_method() bạn muốn gọi MyClass.new_method(obj) ... nói cách khác, ràng buộc hàm là obj để tạo phương thức được ràng buộc là điều sẽ quan tâm đến việc thêm tham số self.

  4. Phương pháp ràng buộc này là phương thức được trả về bởi obj.new_method và sau đó điều này cuối cùng sẽ được gọi là do kết thúc () trên dòng mã đó.

Nếu tìm kiếm lớp cũng không thành công thay vì các lớp cha mẹ cũng được tìm theo thứ tự cụ thể để tìm các phương pháp và thuộc tính kế thừa và do đó mọi thứ phức tạp hơn một chút.

5

Vâng, nếu đó là một loại Python. Ngoại trừ bạn sẽ làm điều đó trên lớp, không phải là mô-đun/gói.

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