2009-02-05 37 views

Trả lời

39

Bạn có thể thêm bất kỳ phương thức nào bạn thích trên các đối tượng lớp được định nghĩa trong mã Python (vá khỉ AKA):

>>> class A(object): 
>>>  pass 


>>> def stuff(self): 
>>>  print self 

>>> A.test = stuff 
>>> A().test() 

Điều này không hoạt động trên các loại nội trang, bởi vì __dict__ không thể ghi được (đó là dictproxy).

Vì vậy không, không có cơ chế phương thức mở rộng "thực" trong Python.

+3

Tôi càng sử dụng Python càng lâu càng tốt! –

7

không chắc chắn nếu những gì bạn đang yêu cầu nhưng bạn có thể mở rộng các loại hiện có và sau đó gọi bất cứ điều gì bạn thích trên điều mới:

class int(int): 
    def random_method(self): 
      return 4      # guaranteed to be random 
v = int(5)        # you'll have to instantiate all you variables like this 
v.random_method() 

class int(int): 
    def xkcd(self): 
     import antigravity 
     print(42) 

>>>v.xkcd() 
Traceback (most recent call last): 
    File "<pyshell#81>", line 1, in <module> 
    v.xkcd() 
AttributeError: 'int' object has no attribute 'xkcd' 
c = int(1) 
>>> c.random_method() 
4 
>>> c.xkcd() 
42 

hy vọng rằng làm rõ câu hỏi của bạn

+0

Nhưng tôi muốn gọi trực tiếp trên các loại hiện có, không phải MyInt, nhưng int. Vì vậy, như v = 5; v.RandomMethod(); –

+0

bạn có thể gọi lớp int (int), nhưng bạn cần phải tạo nhanh biến như: v = int (5) – SilentGhost

+3

Tham chiếu XKCD đẹp. –

0

Một tùy chọn khác là ghi đè lên lớp meta. Điều này cho phép bạn, trong số những thứ khác, chỉ định các hàm cần tồn tại trong tất cả các lớp.

Bài viết này bắt đầu thảo luận về nó:

http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html

+0

Tính năng này có hoạt động đối với các loại nội trang như int không? –

+1

Tôi không nghĩ rằng metaclasses cung cấp cho bạn bất kỳ cách nào để sửa đổi các loại built-in. –

+0

Đó là chính xác, nó chỉ có thể thay đổi hành vi của các lớp học. – tsellon

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