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?
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?
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()
là 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.)
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.
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
.
và tôi nghĩ chức năng và phương thức đồng nghĩa với nhau. – Amarghosh
@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
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