<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": ชาบูๆ
Monday, April 22, 2013
__metaclass__ ใน python by 36kungfu
Labels:
metaclass,
python,
singleton class,
singleton pattern,
โค๊ดต่างๆ,
บทความความรู้