คลาสที่มี Object เป็นพารามิเตอร์


114

ฉันกำลังพยายามแปลโค้ด python เป็นโค้ด scala ดังนั้นฉันจึงเป็น noob ทั้งหมดใน Python

แต่ทำไมบางคลาสจึงมี object เป็นพารามิเตอร์ แต่ไม่เคยใช้อย่างชัดเจน อะไรคือเหตุผลที่ทำให้มันเป็นพารามิเตอร์ตั้งแต่แรก?

ตัวอย่าง:

class Table(object)

ขอขอบคุณสำหรับเวลาของคุณ.


คำตอบ:


112

ใน Python2 สิ่งนี้ประกาศว่าTableเป็นคลาสสไตล์ใหม่ (ซึ่งตรงข้ามกับคลาส "คลาสสิก") ใน Python3 คลาสทั้งหมดเป็นคลาสสไตล์ใหม่ดังนั้นจึงไม่จำเป็นอีกต่อไป

คลาสรูปแบบใหม่มีคุณลักษณะพิเศษบางประการที่คลาสคลาสสิกขาดไป

class Classic: pass
class NewStyle(object): pass

print(dir(Classic))
# ['__doc__', '__module__']

print(dir(NewStyle))
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

นอกจากนี้ยังมีคุณสมบัติและซุปเปอร์จะไม่ได้ทำงานกับการเรียนคลาสสิก

ใน Python2 เป็นความคิดที่ดีที่จะสร้างคลาสสไตล์ใหม่ทั้งหมด (แม้ว่าคลาสจำนวนมากในไลบรารีมาตรฐานยังคงเป็นคลาสคลาสสิกเพื่อประโยชน์ในการใช้งานร่วมกันได้)

โดยทั่วไปในคำสั่งเช่น

class Foo(Base1, Base2):

Fooกำลังถูกประกาศให้เป็นคลาสที่สืบทอดมาจากคลาสพื้นฐานBase1และBase2.

objectเป็นแม่ของทุกชั้นเรียนใน Python มันเป็นคลาสสไตล์ใหม่ดังนั้นการสืบทอดจากobjectทำให้Tableคลาสสไตล์ใหม่


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

1
มีการพูดถึงหลายครั้งใน StackOverflow (เช่นที่นี่ ) แต่ฉันไม่พบคำประกาศง่ายๆของสิ่งนี้ในเอกสาร มันแสดงให้เห็นโดยปริยาย (โดยการละเลยของobjectจากรายการของฐานชั้น) ในการกวดวิชา
unutbu

1
Python3 เอกสารยังรัฐว่า "ชั้นใหม่สไตล์" เป็น "ชื่อเก่าของรสชาติของการเรียนตอนนี้ใช้สำหรับวัตถุทั้งหมดที่ระดับ " (เน้นของฉัน) และPython2 เอกสารรัฐว่า "ชั้นใหม่สไตล์" เป็นชั้น ๆ objectที่สืบทอดมาจาก คำสั่งทั้งสองรวมกันหมายความว่าคุณไม่จำเป็นต้องรวมobjectไว้ในรายการฐานคลาสใน Python3 เนื่องจากคลาสทั้งหมดเป็นคลาสสไตล์ใหม่ใน Python3
unutbu

21

ระดับมีการขยายระดับที่เรียกว่าTable objectไม่ใช่เรื่องทะเลาะกัน เหตุผลที่คุณอาจต้องการขยายobjectอย่างชัดเจนก็คือเปลี่ยนคลาสให้เป็นคลาสรูปแบบใหม่ หากคุณไม่ระบุให้ขยายอย่างชัดเจนobjectจนถึง Python 3 ค่าเริ่มต้นจะเป็นคลาสแบบเก่า (เนื่องจาก Python 3 คลาสทั้งหมดเป็นรูปแบบใหม่ไม่ว่าคุณจะขยายอย่างชัดเจนobjectหรือไม่ก็ตาม)

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับชั้นเรียนรูปแบบใหม่และแบบเก่าโปรดดูคำถามนี้


1
นี่คือคำตอบที่ตรงไปตรงมาและรวบรัดกว่า ขอบคุณ.
Sabuncu

3

โปรดทราบว่าความแตกต่างของคลาส "สไตล์ใหม่" กับ "แบบเก่า" นั้นเฉพาะสำหรับ Python 2.x ใน 3.x คลาสทั้งหมดเป็น "รูปแบบใหม่"


2

class Table และ class Table (object) ไม่แตกต่างกันสำหรับ Python

ไม่ใช่พารามิเตอร์ซึ่งขยายจากออบเจ็กต์ (ซึ่งเป็น Base Class เหมือนภาษาอื่น ๆ )

สิ่งที่กล่าวมาก็คือมันสืบทอดสิ่งที่กำหนดไว้ใน "วัตถุ" นี่คือลักษณะการทำงานเริ่มต้น


3
คลาสที่ขยายโดยอัตโนมัติobjectเป็นพฤติกรรมเริ่มต้นใน Python 3 เท่านั้น ใน python 2 คลาสที่ขยายวัตถุมีแอตทริบิวต์ที่คลาสที่ไม่ขยายวัตถุจะไม่มี
Lewis Ellis

1

วัตถุเป็นประเภทพื้นฐานที่สุดของคลาสอ็อบเจ็กต์ที่กำหนดไว้ใน python คุณสมบัติของวัตถุสามารถดูได้ดังต่อไปนี้

** >>> ผบ. (วัตถุ)

[' class ', ' delattr ', ' doc ', ' format ', ' getattribute ', ' hash ', ' init ', ' new ', ' reduce ', ' reduce_ex ', ' repr ', ' setattr ', ' sizeof ',' str ',' subclasshook '] **

ตาราง (วัตถุ) จึงเป็นเพียงมรดก


0

1) ชื่อคลาส (ออบเจ็กต์): 2) ชื่อคลาส: ทั้งคู่เหมือนกัน แต่อันแรกค่อนข้างดีกว่าในแง่ของการเขียนมันดูดีกว่าในขณะที่สืบทอดคลาสอื่นไปยังอีกคลาสหนึ่งซึ่งดูเป็นเนื้อเดียวกัน

เหมือนกันยังไง? ดังนั้นทุกสิ่งใน Python อยู่ภายใต้ object หมายความว่าทุกสิ่งใน Python มีคุณสมบัติของ object ถ้าเขียนหรือไม่ก็จะเข้าใจ ในตอนแรกเราบอกอย่างชัดเจนในวินาทีที่เราไม่ได้ทำ


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