2016-05-26 12 views
5

Ưu điểm của việc sử dụng các kiểu phương thức từ mô-đun loại là gì. Nó được sử dụng để thêm các phương thức vào đối tượng. Nhưng chúng ta có thể làm điều đó một cách dễ dàng mà không có nó:Lợi thế của việc sử dụng kiểu phương thức trong Python

def func(): 
    print 1 

class A: 
    pass 

obj = A() 
obj.func = func 

Nó hoạt động ngay cả khi chúng ta xóa func trong phạm vi chính bởi del func.

Tại sao một người muốn sử dụng các kiểu phương pháp? Nó chỉ là một quy ước hay thói quen lập trình tốt?

+1

Điều đó không thực sự thêm phương thức vào 'obj'. 'obj.func()' giống như gọi 'func()'. Một phương thức nhận cá thể như là đối số 1. vị trí. Bạn có thể tạo một phương thức ràng buộc với 'func .__ get __ (obj, A)', nhưng điều đó sẽ không hoạt động, vì 'func' không có đối số. –

+0

Hàm 'func' của bạn không có đối số' tự'. Bạn sử dụng 'type' khi bạn muốn đính kèm hoặc thay thế một * phương thức * của một lớp. Ở đây bạn chỉ cần gắn một * chức năng * vào một lớp .. – Cyrbil

Trả lời

3

Trong thực tế, sự khác biệt giữa các phương pháp thêm động tại thời gian chạy và ví dụ của bạn là rất lớn:

  • trong trường hợp của bạn, bạn chỉ cần đính kèm một chức năng để một đối tượng, bạn có thể gọi nó là tất nhiên nhưng nó là cởi, nó không có mối quan hệ với các đối tượng chính nó (tức là. bạn không thể sử dụng self bên trong hàm)
  • khi được bổ sung với MethodType, bạn tạo một phương pháp ràng buộc và nó hoạt động như một phương pháp Python bình thường đối với các đối tượng, bạn phải lấy đối tượng nó thuộc về như là đối số đầu tiên (nó thường được gọi là self) và bạn có thể truy cập nó bên trong hàm

Ví dụ này cho thấy sự khác biệt:

def func(obj): 
    print 'I am called from', obj 
class A: 
    pass 
a=A() 
a.func=func 
a.func() 

này không thành công với một TypeError: func() takes exactly 1 argument (0 given), trong khi mã này hoạt động như mong đợi:

import types 
a.func = types.MethodType(func, a, A) 
a.func() 

show I am called from <__main__.A instance at xxx>.

+0

Vì vậy, trong ngắn hạn nó có nghĩa là tôi sẽ không thể sử dụng các thuộc tính của đối tượng mà tôi sử dụng này khi. Ví dụ, nếu có một thuộc tính, giả sử 'att' trong định nghĩa của tôi thì tôi sẽ không thể sử dụng nó đúng không? – Existent

+0

Trong trường hợp của bạn trong câu hỏi của bạn, chức năng được tách riêng khỏi đối tượng. Không có cách nào để truy cập đối tượng từ hàm vì hàm này không phải là phương thức. – mguijarr

+0

@ABHI không, 'att' có thể được truy cập từ bất cứ đâu, nhưng bạn cần một thể hiện của lớp để truy cập nó (tức là' att' không có nghĩa gì cả, bạn cần 'obj.att'). Các phương thức được định nghĩa bình thường (và do đó bị ràng buộc) có được 'self'argument là cá thể mà phương thức được ràng buộc và vì vậy chúng có một cách dễ dàng để có được' att' thích hợp. –

3

Sử dụng phổ biến là types.MethodType đang kiểm tra xem một số đối tượng có phải là phương pháp hay không. Ví dụ:

>>> import types 
>>> class A(object): 
...  def method(self): 
...   pass 
... 
>>> isinstance(A().method, types.MethodType) 
True 
>>> def nonmethod(): 
...  pass 
... 
>>> isinstance(nonmethod, types.MethodType) 
False 

Lưu ý rằng trong ví dụ isinstance(obj.func, types.MethodType) trả về False. Hãy tưởng tượng bạn đã xác định phương thức meth trong lớp A. isinstance(obj.meth, types.MethodType) sẽ trả lại True.

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