Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ข้อใดเป็นพื้นฐานมากกว่าระหว่างฟังก์ชัน Python และวิธีการอ็อบเจ็กต์ของ Python


ฟังก์ชันเป็นอ็อบเจกต์ที่เรียกใช้ได้ใน Python เช่น สามารถเรียกได้โดยใช้โอเปอเรเตอร์การโทร อย่างไรก็ตาม อ็อบเจ็กต์อื่นยังสามารถจำลองฟังก์ชันได้โดยใช้ __call__method

ตัวอย่าง

def a(): pass # a() is an example of function
print a
print type(a)

ผลลัพธ์

C:/Users/TutorialsPoint/~.py
<function a at 0x0000000005765C18>
<type 'function'>

เมธอดเป็นคลาสพิเศษของฟังก์ชัน ซึ่งสามารถผูกหรือเลิกผูกได้

ตัวอย่าง

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()

แน่นอน ไม่สามารถเรียกเมธอดที่ไม่ผูกมัดได้โดยไม่ส่งผ่านอาร์กิวเมนต์

ผลลัพธ์

<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)

ใน Python ไม่มีความแตกต่างกันมากนักระหว่าง bound method, function หรือ callable object (นั่นคืออ็อบเจกต์ที่ใช้วิธี __call__) หรือตัวสร้างคลาส พวกเขาทั้งหมดมีลักษณะเหมือนกัน พวกเขามีรูปแบบการตั้งชื่อที่แตกต่างกันและอาจดูแตกต่างกันอย่างมากแม้ว่าจะอยู่ภายใต้ประทุน

ซึ่งหมายความว่าเมธอดที่ถูกผูกไว้สามารถใช้เป็นฟังก์ชันได้ นี่เป็นหนึ่งในสิ่งเล็กๆ มากมายที่ทำให้ Python มีประสิทธิภาพมาก

>>> d = A().a #this is a bound method of A()
>>> d() # this is a function

นอกจากนี้ยังหมายความว่าแม้ว่าจะมีความแตกต่างพื้นฐานระหว่าง len(...) และ str(...) (str คือตัวสร้างประเภท) เราจะไม่สังเกตเห็นความแตกต่างจนกว่าเราจะเจาะลึกลงไปอีกเล็กน้อย:

>>>len
<built-in function len>
>>> str
<type 'str'>