จำเป็นหรือมีประโยชน์ที่จะสืบทอดจากวัตถุของ python ใน Python 3.x?


94

ใน python เวอร์ชันเก่ากว่าเมื่อคุณสร้างคลาสใน python มันสามารถสืบทอดจากอ็อบเจ็กต์ซึ่งเท่าที่ฉันเข้าใจองค์ประกอบ python ในตัวพิเศษที่อนุญาตให้อ็อบเจ็กต์ของคุณเป็นอ็อบเจ็กต์รูปแบบใหม่

เวอร์ชันที่ใหม่กว่า (> 3.0 และ 2.6) ล่ะ? ฉัน googled เกี่ยวกับคลาสออบเจ็กต์ แต่ฉันได้รับผลลัพธ์มากมาย (ด้วยเหตุผลที่ชัดเจน) คำแนะนำใด ๆ ?

ขอบคุณ!


2
หากรหัสของคุณจะถูกใช้ต่ำกว่า 2.x ด้วยก็เป็นการดีที่จะอธิบายอย่างชัดเจน
smci

1
คำถามนี้ตอบได้ดี: stackoverflow.com/questions/4015417/…
nngeek

คำตอบ:


94

คุณไม่จำเป็นต้องสืบทอดจากobjectเพื่อให้มีสไตล์ใหม่ใน python 3 คลาสทั้งหมดเป็นรูปแบบใหม่


5
สังเกตว่านี่หมายความว่าคลาสทั้งหมดจะสืบทอดจากobjectไม่ว่าจะพิมพ์ Explicit (object)หรือไม่ก็ตามใน Python 3.1
u0b34a0f6ae

8
คุณไม่จำเป็นต้องทำ แต่ "การย้ายรหัส Python ไปยัง Python 3" บอกว่ายังใช้ได้: docs.python.org/py3k/howto/pyporting.html#subclass-objectนอกจากนี้: docs.python.org/reference/ …
hyperboreean

จากโพสต์นี้ที่กล่าวถึงในความคิดเห็นของ nngeek ดูเหมือนว่าการอ้างอิงที่มั่นคงที่ดีสำหรับรูปแบบเก่ากับรูปแบบใหม่ (เฉพาะที่เกี่ยวข้องกับ Py2 เท่านั้น) คือ: docs.python.org/2/reference/… - ลิงก์ด้านบนดูเหมือนจะมี ตั้งแต่มีการเปลี่ยนแปลง
Eric Cousineau

80

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ก็น่าสังเกตว่าแม้ใน python 3 ทั้งสองสิ่งนี้จะไม่เหมือนกันเลย

หากคุณได้รับมรดกอย่างชัดเจนobjectสิ่งที่คุณกำลังทำคือการสืบทอดมาbuiltins.object โดยไม่คำนึงถึงสิ่งที่ชี้ไปในเวลานั้น

ดังนั้นฉันสามารถมีโมดูล (แปลกประหลาดมาก) ที่แทนที่วัตถุด้วยเหตุผลบางประการ เราจะเรียกโมดูลแรกนี้ว่า newobj.py:

import builtins

old_object = builtins.object  # otherwise cyclic dependencies

class new_object(old_object):

    def __init__(self, *args, **kwargs):
        super(new_object, self).__init__(*args, **kwargs)
        self.greeting = "Hello World!" 

builtins.object = new_object  #overrides the default object

จากนั้นในไฟล์อื่น ๆ ("klasses.py"):

class Greeter(object):
    pass

class NonGreeter:
    pass

จากนั้นในไฟล์ที่สาม (ซึ่งเราสามารถเรียกใช้งานได้จริง):

import newobj, klasses  # This order matters!

greeter = klasses.Greeter()
print(greeter.greeting)  # prints the greeting in the new __init__

non_greeter = klasses.NonGreeter()
print(non_greeter.greeting) # throws an attribute error

ดังนั้นคุณจะเห็นได้ว่าในกรณีที่สืบทอดมาจากวัตถุอย่างชัดเจนเราจะได้รับพฤติกรรมที่แตกต่างจากที่คุณอนุญาตให้มีการสืบทอดโดยนัย


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