@ staticmethod เทียบกับฟังก์ชั่นระดับโมดูล


21

นี่ไม่เกี่ยวกับ@staticmethodและ@classmethod! ฉันรู้ว่าstaticmethodทำงานอย่างไร สิ่งที่ฉันต้องการทราบคือกรณีการใช้งานที่เหมาะสมสำหรับ@staticmethodvs. ฟังก์ชันระดับโมดูล

ฉันได้ลองคำถามนี้และดูเหมือนว่ามีข้อตกลงทั่วไปที่ต้องการฟังก์ชั่นโมดูลในระดับมากกว่าวิธีคงที่เพราะมันเป็นแบบ pythonic วิธีการแบบสแตติกมีข้อได้เปรียบของการถูกผูกไว้กับคลาสของมันซึ่งอาจสมเหตุสมผลถ้าคลาสนั้นใช้เท่านั้น อย่างไรก็ตามในฟังก์ชั่น Python มักจะจัดระเบียบโดยโมดูลไม่ได้เรียนดังนั้นมักจะทำให้ฟังก์ชั่นโมดูลทำให้รู้สึกเกินไป

วิธีการแบบสแตติกสามารถแทนที่ได้ด้วยคลาสย่อยซึ่งเป็นข้อดีหรือข้อเสียขึ้นอยู่กับว่าคุณมองอย่างไร แม้ว่าวิธีการแบบสแตติกมักจะ "บริสุทธิ์ตามหน้าที่" ดังนั้นการเอาชนะมันอาจไม่ฉลาด แต่บางครั้งก็สะดวก (แม้ว่านี่อาจเป็นหนึ่งใน "สะดวก แต่ไม่เคยทำ" สิ่งที่มี แต่ประสบการณ์เท่านั้นที่สามารถสอนคุณได้)

มีกฎทั่วไปหรือไม่สำหรับการใช้ฟังก์ชั่นสแตติกวิธีการหรือโมดูลระดับ? พวกเขามีข้อดีหรือข้อเสียที่เป็นรูปธรรมใดบ้าง (เช่นส่วนขยายในอนาคตส่วนขยายภายนอกความสามารถในการอ่าน) ถ้าเป็นไปได้ก็ให้ตัวอย่างกรณี

คำตอบ:


11

ในทางเทคนิควิธีการคงที่และฟังก์ชั่นโมดูลมีพฤติกรรมเหมือนกันมาก - ในทั้งสองกรณีพวกเขาทำงานเหมือนฟังก์ชั่นมาตรฐานความแตกต่างคือเนมสเปซที่พวกเขาอยู่ ดังนั้นการตัดสินใจคือการบำรุงรักษา / การอ่านที่ง่ายขึ้น

โดยทั่วไปฉันจะใช้วิธีการคงที่หากตรงตามเกณฑ์เหล่านี้บางส่วนหรือทั้งหมด:

  • มีคลาสที่มีอยู่แล้วด้วยวิธีการปกติ
  • ฟังก์ชั่นที่เกี่ยวข้องกับวัตถุของคลาสโดยทั่วไป แต่ไม่ใช่หนึ่งอินสแตนซ์ที่เฉพาะเจาะจง
  • คุณต้องการที่จะสามารถเรียกวิธีการราวกับว่ามันเป็นวิธีที่ไม่คงที่อาจเป็นเพราะคุณอาจต้องการที่จะทำให้วิธีการที่ไม่คงที่ในอนาคตโดยไม่ต้องทำลายรหัสลูกค้า

0

โปรแกรมเป็นการจำลองชิ้นส่วนของความเป็นจริง วิธีนี้มันขึ้นอยู่กับว่าคุณรับรู้ความจริง

ฟังก์ชั่นแสดงถึงกิจกรรมบางอย่าง ยิ่งกิจกรรมเป็นเรื่องทั่วไปยิ่งมีแนวโน้มมากที่จะจำลองกิจกรรมด้วยฟังก์ชั่น วิธีการที่ถูกผูกไว้กับชั้นเรียน ยิ่งกิจกรรมมีความเฉพาะเจาะจงในชั้นเรียนยิ่งมีแนวโน้มที่จะถูกจำลองด้วยวิธีการมากขึ้น

นึกถึงฟังก์ชันตรีโกณมิติ บอกเด็กsin()ๆ ว่าเป็นที่รู้กันดีว่าคุณรู้ว่ามันเข้ากับมุม คุณรู้ว่ามันต้องการตัวเลขลอยเป็นอินพุตและส่งกลับค่าลอย อย่างไรก็ตามอาจมีประเภทข้อมูลมุมที่แสดงโดยคลาสและ.sin()ไม่มีอาร์กิวเมนต์อาจเป็นวิธีการปกติที่ทำงานกับวัตถุมุมและ.sin(x)อาร์กิวเมนต์เดียวอาจเป็นวิธีการคงที่ของชั้นเรียน ฉันพนันได้เลยว่าผู้คนจำนวนมากคิดว่ามันเป็นการดีที่จะทำsin()ฟังก์ชั่นธรรมดา พวกเขาคุ้นเคยมากกว่า

มุมมองอื่น : โมดูลคล้ายกับอินสแตนซ์ของคลาส มันมีตัวแปรสมาชิกของตัวเองและฟังก์ชั่นสมาชิก ในบางแง่มันใช้รูปแบบซิงเกิล เมื่อใดก็ตามที่คุณนำเข้าจากโมดูลอื่นของแอปพลิเคชันคุณจะได้รับการเข้าถึงตัวแปรและฟังก์ชั่นที่เหมือนกันทุกประการ


0

ฉันมีฟังก์ชั่นที่จะใช้เป็นส่วนหนึ่งของลำดับชั้นข้อมูลที่ลึกของวัตถุเป็นอาร์กิวเมนต์ มันจะยุ่งยากในการส่งผ่านอาร์กิวเมนต์หลาย ๆ อันที่จำเป็นเพื่อไปยังส่วนของลำดับชั้นข้อมูลนั้นแทน ดังนั้นจึงไม่มีเหตุผลที่จะอ้างอิงตนเองหรือ cls แต่ฟังก์ชั่นนี้จะใช้กับชิ้นส่วนของวัตถุของคลาสเฉพาะเท่านั้น ดังนั้นจึงเป็นวิธีการเรียนสำหรับฉัน

นอกจากนี้ฉันชอบที่จะนำเข้าชื่อคลาส ('จากคลาสที่อิมพอร์ตโมดูล' แทน 'โมดูลนำเข้า') การรวมฟังก์ชั่นเป็นวิธีการแบบสแตติกช่วยให้ฉันสามารถเข้าถึงวิธีการในขณะที่เขียนมันเป็นฟังก์ชั่นระดับโมดูลจะต้องนำเข้าที่แตกต่างกัน


2
ถ้าฉันเป็นคุณฉันจะหลีกเลี่ยงการตอบในคนแรก มันทำให้สับสน คุณควรเขียนบุคคลที่สองไปยังผู้ถามแทน
Aaron Hall

บางที. ฉันกำลังให้ตัวอย่างกรณีการใช้งานที่อาจหรืออาจไม่ตรงกับสิ่งที่ผู้ถามมีอยู่ในใจ
ดีวีดี Avins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.