ตัวอย่างข้อมูลทั้งสองทำสิ่งที่แตกต่างกันดังนั้นจึงไม่ใช่เรื่องของรสนิยม แต่เป็นเรื่องของพฤติกรรมที่เหมาะสมในบริบทของคุณ เอกสาร Pythonอธิบายความแตกต่าง แต่นี่คือตัวอย่างบางส่วน:
จัดแสดงนิทรรศการ
class Foo:
def __init__(self):
self.num = 1
ผูกนี้num
กับฟูอินสแตนซ์ การเปลี่ยนฟิลด์นี้จะไม่แพร่กระจายไปยังอินสแตนซ์อื่น
ดังนั้น:
>>> foo1 = Foo()
>>> foo2 = Foo()
>>> foo1.num = 2
>>> foo2.num
1
นิทรรศการ B
class Bar:
num = 1
ผูกนี้num
ไปที่บาร์ชั้น การเปลี่ยนแปลงถูกเผยแพร่!
>>> bar1 = Bar()
>>> bar2 = Bar()
>>> bar1.num = 2
>>> bar2.num
1
>>> Bar.num = 3
>>> bar2.num
3
>>> bar1.num
2
>>> bar1.__class__.num
3
คำตอบที่แท้จริง
หากฉันไม่ต้องการตัวแปรคลาส แต่เพียงแค่ตั้งค่าเริ่มต้นสำหรับตัวแปรอินสแตนซ์ของฉันทั้งสองวิธีจะดีเท่ากันหรือไม่ หรือหนึ่งในนั้น 'pythonic' มากกว่าอีกตัว?
รหัสในการจัดแสดง B นั้นไม่ถูกต้องสำหรับสิ่งนี้: เหตุใดคุณจึงต้องการผูกแอตทริบิวต์คลาส (ค่าเริ่มต้นในการสร้างอินสแตนซ์) กับอินสแตนซ์เดียว
รหัสในการจัดแสดง A ไม่เป็นไร
หากคุณต้องการให้ค่าเริ่มต้นสำหรับตัวแปรอินสแตนซ์ในตัวสร้างของคุณฉันจะทำสิ่งนี้:
class Foo:
def __init__(self, num = None):
self.num = num if num is not None else 1
...หรือแม้กระทั่ง:
class Foo:
DEFAULT_NUM = 1
def __init__(self, num = None):
self.num = num if num is not None else DEFAULT_NUM
... หรือแม้กระทั่ง: (เป็นที่ต้องการ แต่ถ้าและเฉพาะในกรณีที่คุณกำลังจัดการกับประเภทที่ไม่เปลี่ยนรูป!)
class Foo:
def __init__(self, num = 1):
self.num = num
วิธีนี้คุณสามารถทำได้:
foo1 = Foo(4)
foo2 = Foo()
self.attr = attr or []
ภายใน__init__
วิธีการ มันได้ผลลัพธ์เดียวกัน (ฉันคิดว่า) และยังคงชัดเจนและอ่านได้