รูปแบบการออกแบบหลาม [ปิด]


166

ฉันกำลังมองหาแหล่งข้อมูลใด ๆ ที่ให้ตัวอย่างของวิธีปฏิบัติที่ดีที่สุดรูปแบบการออกแบบและหลักการ SOLID โดยใช้ Python



คำตอบ:


152

บางส่วนทับซ้อนกันในสิ่งเหล่านี้

ช่างไม้ซอฟต์แวร์ระดับกลางและระดับสูงใน Python

รหัสเหมือน Pythonista: Idiomatic Python

Python Idioms และประสิทธิภาพ

Google Developers Day US - รูปแบบการออกแบบของ Python

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


1
ลิงค์ที่สามเสียชีวิต พยายามหากระจก แต่ทำไม่ได้ถ้าใครมีลิงค์ที่ถูกต้องโปรดเพิ่ม
formatkaka

1
ที่นี่Python Idioms and Efficiencyดูเหมือนจะไม่ทำงาน
Dawid Laszuk

ลิงก์แรกและลิงก์ที่สองนั้นตายแล้วดังนั้นฉันจึงอัปเดตภาพรวมด้วย Internet Archive snapshot พวกเขาดูเหมือนจะเก่ามากแม้ว่าฉันจะแน่ใจว่ามันยังมีความเกี่ยวข้องอยู่มาก
mannykary

24

ชนิด

>>> import this

ในคอนโซล Python

แม้ว่าโดยปกติแล้วจะถือว่าเป็นเรื่องตลก (ดี!) แต่ก็มีความจริงที่เฉพาะเจาะจงของงูหลาม


13

" ความคิดใน Python " ของ Bruce Eckel นั้นเน้นหนักในเรื่องของลวดลายการออกแบบ


2
หมายเหตุว่าตามที่วิกิพีเดียหนังสือเล่มนี้ไม่ได้รับการบำรุงรักษา
sakisk

ลิงค์อัพเดท [thinking in python] ( mindview.net/Books/Python/ThinkingInPython.html )
surge10

6

คุณสามารถเริ่มต้นที่นี่และที่นี่

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


8
ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะต้องเข้าใจวิธีการใช้ภาษาไพ ธ อนสำหรับการใช้รูปแบบการออกแบบ มันเป็นภาษาที่แตกต่างจาก C ++ ซึ่งใช้ใน GOF ดังนั้นการย้ายจาก C ++ ไปยัง python จะส่งผลให้ไม่มีโค้ดไพ ธ อน
sakisk

1
ฉันมักจะไม่เห็นด้วย Singleton DP หรือ DP อื่น ๆ จะเป็นไปได้ในภาษา OO ไม่ว่าจะเป็น Python, Java หรือ C ++ ในความเห็นของคุณไม่มีอะไรที่ไพทอน
Paul Hiemstra

1
ลิงค์แรกเป็นกระดาษที่ค่อนข้างยากจนโดยมีข้อผิดพลาดมากมายเกี่ยวกับ Python ครั้งที่สองในขณะนี้ 404 ของดังนั้นฉันคิดว่าทำความเสียหายน้อยกว่ามาก :)
แบรนดอนโรดส์

6

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

โดยประมาณเป้าหมายกับวัตถุ Null คือการให้การแทนที่ 'อัจฉริยะ' สำหรับชนิดข้อมูลดั้งเดิมที่มักใช้ไม่มีใน Python หรือ Null (หรือตัวชี้ Null) ในภาษาอื่น สิ่งเหล่านี้ถูกใช้เพื่อจุดประสงค์หลายอย่างรวมถึงกรณีที่สำคัญซึ่งสมาชิกหนึ่งคนขององค์ประกอบบางอย่างที่คล้ายคลึงกันนั้นมีความพิเศษไม่ว่าด้วยเหตุผลใดก็ตาม ส่วนใหญ่มักจะส่งผลให้งบที่มีเงื่อนไขเพื่อแยกความแตกต่างระหว่างองค์ประกอบสามัญและค่า Null ดั้งเดิม

วัตถุนี้กินข้อผิดพลาดของคุณลักษณะเพียงอย่างเดียวและคุณสามารถหลีกเลี่ยงการตรวจสอบว่ามีอยู่จริงหรือไม่

มันไม่มีอะไรมากไปกว่า

class Null(object):

    def __init__(self, *args, **kwargs):
        "Ignore parameters."
        return None

    def __call__(self, *args, **kwargs):
        "Ignore method calls."
        return self

    def __getattr__(self, mname):
        "Ignore attribute requests."
        return self

    def __setattr__(self, name, value):
        "Ignore attribute setting."
        return self

    def __delattr__(self, name):
        "Ignore deleting attributes."
        return self

    def __repr__(self):
        "Return a string representation."
        return "<Null>"

    def __str__(self):
        "Convert to a string and return it."
        return "Null"

ด้วยวิธีนี้ถ้าคุณทำNull("any", "params", "you", "want").attribute_that_doesnt_exists()มันจะไม่ระเบิด passแต่เพียงเงียบกลายเป็นเทียบเท่า

โดยปกติคุณจะทำอะไรเช่น

if obj.attr:
    obj.attr()

ด้วยสิ่งนี้คุณเพียงทำ:

obj.attr()

และลืมมัน ระวังการใช้Nullวัตถุอย่างกว้างขวางอาจซ่อนข้อบกพร่องในรหัสของคุณ


3

คุณอาจต้องการอ่านบทความนี้ (เลือกไฟล์. pdf) ซึ่งกล่าวถึงรูปแบบการออกแบบในภาษาเชิงวัตถุแบบไดนามิก (เช่น Python) ในการอ้างถึงหน้า:

กระดาษนี้จะสำรวจว่ารูปแบบจากหนังสือ "Gang of Four" หรือ "GOF" นั้นมักถูกเรียกว่าอย่างไรปรากฏขึ้นเมื่อปัญหาที่คล้ายกันได้รับการแก้ไขโดยใช้ภาษาโปรแกรมเชิงวัตถุที่มีลำดับสูงกว่า รูปแบบบางส่วนหายไป - นั่นคือรองรับรูปแบบภาษาโดยตรงบางรูปแบบนั้นง่ายกว่าหรือมีจุดโฟกัสที่แตกต่างกันและบางรูปแบบก็ไม่เปลี่ยนแปลง


1
คำถามเกี่ยวกับ Python บทความนี้พูดถึงภาษาที่เหมือนกับ Scheme ซึ่งเป็นสิ่งที่ฉันสามารถบอกได้ว่าคิดค้นขึ้นมาตรงจุดสำหรับบทความนี้โดยเฉพาะ เว้นแต่ผู้ถามจะเป็น (a) นักวิทยาศาสตร์คอมพิวเตอร์เชิงวิชาการที่มีประสบการณ์ยาวนานกับการฝึก Python ฉันสงสัยว่าพวกเขาจะได้รับสิ่งที่มีค่าจากกระดาษหรือไม่และพวกเขาอาจจะไม่ถามคำถามนี้ ในที่แรก. :)
แบรนดอนโรดส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.