Một hàm là một đối tượng có thể gọi trong Python, tức là có thể được gọi bằng cách sử dụng toán tử cuộc gọi. Tuy nhiên, các đối tượng khác cũng có thể mô phỏng một hàm bằng cách triển khai __call__method.
ví dụ
def a(): pass # a() is an example of function print a print type(a)
Đầu ra
C:/Users/TutorialsPoint/~.py <function a at 0x0000000005765C18> <type 'function'>
Phương thức là một lớp hàm đặc biệt, có thể được liên kết hoặc không liên kết.
Ví dụ
class C: def c(self): pass print C.c # example of unbound method print type(C.c) print C().c # example of bound method print type(C().c) print C.c()
Tất nhiên, một phương thức không liên kết không thể được gọi mà không chuyển dưới dạng đối số.
Đầu ra
<function a at 0xb741b5a4> <type 'function'> <unbound method C.c> <type 'instancemethod'> <bound method C.c of <__main__.C instance at 0xb71ade0c>> <type 'instancemethod'> Traceback (most recent call last): File "~.py", line 11, in <module> print C.c() TypeError: unbound method c() must be called with C instance as first argument (got nothing instead)
Trong Python, không có nhiều sự khác biệt giữa phương thức liên kết, một hàm hoặc một đối tượng có thể gọi (đó là một đối tượng triển khai phương thức __call__) hoặc một phương thức khởi tạo lớp. Tất cả chúng trông giống nhau, chúng chỉ có các quy ước đặt tên khác nhau và có thể trông rất khác nhau mặc dù dưới lớp vỏ bọc.
Điều này có nghĩa là một phương thức liên kết có thể được sử dụng như một hàm, đây là một trong nhiều điều nhỏ làm cho Python trở nên mạnh mẽ như vậy
>>> d = A().a #this is a bound method of A() >>> d() # this is a function
Điều đó cũng có nghĩa là mặc dù có sự khác biệt cơ bản giữa len (...) và str (...) (str là một hàm tạo kiểu), chúng ta sẽ không nhận thấy sự khác biệt cho đến khi tìm hiểu sâu hơn một chút:
>>>len <built-in function len> >>> str <type 'str'>