2009-11-30 42 views
8

Hoặc là tất cả mọi thứ một phương pháp?Có chức năng nào trong Python không?

Kể từ khi tất cả mọi thứ là một đối tượng, một

def whatever: 

chỉ là một phương pháp file.py mà, phải không?

+0

và tôi nghĩ chức năng và phương thức đồng nghĩa với nhau. – Amarghosh

+4

@Amarghosh: Không. Các phương thức là các bộ mô tả liên kết với một lớp. – nosklo

+1

Thuật ngữ khác nhau giữa các ngôn ngữ tôi tin - trong java mọi thứ đều là một phương pháp - tĩnh hoặc thể hiện. – Amarghosh

Trả lời

31

Python có chức năng. Vì mọi thứ đều là một đối tượng functions are objects too.

Vì vậy, để sử dụng ví dụ của bạn:

>>> def whatever(): 
...  pass 
... 
>>> whatever 
<function whatever at 0x00AF5F30> 

Khi chúng tôi sử dụng def chúng tôi đã tạo ra một đối tượng mà là một chức năng. Chúng tôi có thể, ví dụ, hãy nhìn vào một thuộc tính của đối tượng:

>>> whatever.func_name 
'whatever' 

Trong câu trả lời cho câu hỏi của bạn - whatever()không một phương pháp của file.py. Nó là tốt hơn để nghĩ về nó như là một đối tượng chức năng ràng buộc với tên whatever trong không gian tên toàn cầu của file.py.

>>> globals() 
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__d 
oc__': None, 'whatever': <function whatever at 0x00AF5EB0>} 

Hoặc để nhìn vào nó một cách khác, không có gì ngăn chặn chúng ta khỏi ràng buộc tên whatever đến một đối tượng khác nhau hoàn toàn là:

>>> whatever 
<function whatever at 0x00AF5F30> 
>>> whatever = "string" 
>>> whatever 
'string' 

Có nhiều cách khác để tạo các đối tượng chức năng. Ví dụ: :

>>> somelambda = lambda x: x * 2 
>>> somelambda 
<function <lambda> at 0x00AF5F30> 

Phương pháp giống như thuộc tính của đối tượng là hàm. Điều gì làm cho nó một phương pháp là các phương pháp được ràng buộc với đối tượng. Điều này làm cho đối tượng được truyền cho hàm như đối số đầu tiên mà chúng ta thường gọi là self.

Hãy định nghĩa một lớp SomeClass với một phương pháp somemethod và một thể hiện someobject:

>>> class SomeClass: 
...  def somemethod(one="Not Passed", two="Not passed"): 
...   print "one = %s\ntwo = %s" % (one,two) 
... 
>>> someobject = SomeClass() 

Hãy nhìn vào somemethod như một thuộc tính:

>>> SomeClass.somemethod 
<unbound method SomeClass.somemethod> 
>>> someobject.somemethod 
<bound method SomeClass.somemethod of <__main__.SomeClass instance at 0x00AFE030 

Chúng ta có thể thấy đó là một phương pháp ràng buộc về đối tượng và một phương pháp không liên kết trên lớp. Vì vậy, bây giờ hãy gọi phương thức và xem những gì sẽ xảy ra:

>>> someobject.somemethod("Hello world") 
one = <__main__.SomeClass instance at 0x00AFE030> 
two = Hello world 

Vì nó là một phương pháp ràng buộc đối số đầu tiên nhận được somemethod là đối tượng và đối số thứ hai là đối số đầu tiên trong các cuộc gọi phương pháp. Hãy gọi phương thức trên lớp:

>>> SomeClass.somemethod("Hello world") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unbound method somemethod() must be called with SomeClass instance as first argument (got str instance instead) 

Python than phiền vì chúng tôi đang cố gắng gọi phương thức mà không đưa cho đối tượng loại thích hợp.Vì vậy, chúng ta có thể khắc phục điều này bằng cách thông qua các đối tượng "bằng tay":

>>> SomeClass.somemethod(someobject,"Hello world") 
one = <__main__.SomeClass instance at 0x00AFE030> 
two = Hello world 

Bạn có thể sử dụng các cuộc gọi phương pháp thuộc loại này - gọi một phương thức trên lớp - khi bạn muốn gọi một phương pháp cụ thể từ một lớp cha.

(Có thể take a function and bind it to class to make it a method, nhưng đây không phải là một cái gì đó mà bạn muốn bình thường bao giờ cần phải làm.)

0

Hmm ... Bạn có thể làm việc với "bất kỳ" như một hàm bình thường trong không gian tên tệp.

2

Không giống như trong Java bằng Python một file có tên file.py không nhất thiết chứa một lớp được gọi là file như bạn có thể mong đợi nếu đây là tệp java có tên là file.java.

Trong Python một tệp là một mô-đun thực sự chỉ là một không gian tên (có thể so sánh được với một gói Java hơn là một lớp Java) và không phải là một lớp. Xem xét ví dụ file.py dưới đây:

def whatever_func(): 
    print "What ever function" 

class SomeClass(object): 
    def whatever_meth(self): 
     print "What ever method" 

Trong ví dụ trên các file mô-đun/namespace chứa một chức năng bình thường tên là whatever_func và một lớp SomeClass trong đó có một phương pháp whatever_meth.

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