Monday, April 22, 2013

__metaclass__ ใน python by 36kungfu

<01:31:26> "36kungfu": มีใครเข้าใจ __metaclass__ ใน python
<01:31:34> "36kungfu": ช่วยอธิบายให้เข้าใจง่ายๆ ที
<01:32:56> "36kungfu": เงียบกริบ
<01:33:13> "caznova": กริบ
<01:34:07> "36kungfu": ok ไม่ต้องแล้ว
<01:34:15> "36kungfu": get แระ
<01:35:41> "36kungfu": สุดยอด เอาไปเล่นอะไรได้เยอะแฮะแบบนี้
<01:35:44> "36kungfu": *0*
<01:36:40> "OllyDBG 1.10": LoL
<01:37:11> "36kungfu": ???
<01:37:12> "Sappunts[Moe Moe Kyun~]": lol
<01:38:38> "36kungfu": หัวเราะอะไรกันหว่า
<01:38:43> "36kungfu": บอกให้รู้มั่งจิ
<01:39:37> "looongcat": ปั่นงานน
<01:39:49> "looongcat": คืออะไรหว่า metaclass
<01:40:03> "36kungfu": ยกตัวอย่างดีกว่า
<01:40:06> "36kungfu": เข้าใจง่ายดี
<01:40:26> "looongcat": *-*
<01:40:30> "36kungfu": ประมาณว่า
class A:
pass
<01:40:53> "36kungfu": ปกติถ้าเรา print( str( A ) )
<01:41:37> "36kungfu": มันจะได้เลข id มา
<01:41:50> "36kungfu": ประมาณ <> 0x12323 อะไรแบบเนี้ยมั้ง
<01:41:50> "looongcat": อ่างับ
<01:42:05> "36kungfu": แต่ถ้าเราสร้าง class ขึ้นมาอีก class
<01:43:33> "36kungfu": เช่น
class meta:
def __str__( s ):
return "36kungfu"
<01:43:42> "36kungfu": แล้วแก้ class A
<01:44:05> "36kungfu": เป็น 
class A:
__metaclass__ = meta
<01:44:17> "looongcat": *-* เพื่อ
<01:44:18> "36kungfu": เวลาสั่ง str( A )
<01:44:34> "36kungfu": มันจะ print คำว่า "36kungfu"
<01:44:52> "looongcat": เหมือนเปลี่ยน id มันเหรอ O_O
<01:45:37> "36kungfu": คิดซะว่า __metaclass__ มันจะไปดูว่า function ที่เรียก class นั้น
มีกำหนดใน meta ไหม
<01:45:47> "36kungfu": str -> __str__
<01:46:26> "looongcat": อ่อเข้าใจละ ขอบคุณงับ
<01:46:29> "36kungfu": str( A ) โดยปกติ จะเรียก global function ของ python
แต่พอมีการกำหนด metaclass มันจะไปเรียก __str__ ของ class meta
<01:46:50> "looongcat": มันเหมือน override แบบกำหนด class เป้าหมายได้?
<01:47:25> "looongcat": อ๊ะหรือไม่ใช่ 55
<01:47:31> "36kungfu": ไม่ใช่
<01:47:46> "looongcat": มันเหมือนยืมมางี้ปะหว่า
<01:48:45> "caznova": hook
<01:49:09> "36kungfu": อืมมม ประมาณนั้นน่าจะใช่ (มั้ง)
<01:49:23> "36kungfu": <01:51:11> "36kungfu": str( A )
โดยปกติ จะเรียก global function ของ python แต่พอมีการกำหนด metaclass
มันจะไปเรียก __str__ ของ class meta <<< คิดแค่นี้พอ
<01:49:39> "36kungfu": แต่ใช้ str อาจจะไม่เห็นภาพ ว่าเอาไปใช้ต่อยังไง
<01:49:45> "looongcat": ช่าย ๆ
<01:49:48> "36kungfu": ขอยกตัวอย่าง ที่เอาไปใช้ได้จริงนะ
<01:50:11> "36kungfu": สร้าง
class c_singleton( type ):
def __init__( cls, name, bases, dict ):
super( c_singleton, cls ).__init__( name, bases, dict )
cls.instance = None 
def __call__( cls, *args, **kw ):
if cls.instance is None:
cls.instance = super( c_singleton, cls ).__call__( *args, **kw )
return cls.instance
<01:50:27> "looongcat": *0*
<01:50:39> "36kungfu": แล้วกำหนด
class myclass:
__metaclass__ = c_singleton
<01:50:54> "36kungfu": จะทำให้ ไม่ว่าจะเรียก myclass() กี่ครั้ง
<01:51:06> "36kungfu": ก็ยังคงได้ instance ของ myclass อันเดิม
<01:51:15> "36kungfu": ไม่มีการ new ใหม่
<01:51:21> "looongcat": singleton patternn
<01:51:26> "36kungfu": เป็น singleton class นั่นเอง
<01:52:11> "36kungfu": เหมือนเป็นการเล่นกับ init( myclass ) กับ call( myclass )
<01:53:00> "caznova": singleton ของ python แบบนี้เทห์จัง
<01:53:33> "looongcat": อ่าขอบคุณมากงับ //ปั่นงานต่อ
<01:53:44> "Tum": ชาบูๆ

No comments:

Why You Don't LIKE My FaceBook Fanpage ?
×
blogger