ฉันจะรับคลาส parent (es) ของคลาส Python ได้อย่างไร
ฉันจะรับคลาส parent (es) ของคลาส Python ได้อย่างไร
คำตอบ:
ใช้คุณลักษณะต่อไปนี้:
cls.__bases__
จากเอกสาร :
tuple ของคลาสพื้นฐานของคลาสอ็อบเจ็กต์
ตัวอย่าง:
>>> str.__bases__
(<type 'basestring'>,)
ตัวอย่างอื่น:
>>> class A(object):
... pass
...
>>> class B(object):
... pass
...
>>> class C(A, B):
... pass
...
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)
หากคุณต้องการบรรพบุรุษทั้งหมดไม่ใช่แค่คนใกล้ตัวใช้inspect.getmro :
import inspect
print inspect.getmro(cls)
มีประโยชน์สิ่งนี้จะให้คลาสบรรพบุรุษทั้งหมดใน "ลำดับการแก้ไขเมธอด" - นั่นคือลำดับที่บรรพบุรุษจะถูกตรวจสอบเมื่อทำการแก้ไขเมธอด (หรือที่จริงแล้วแอ็ตทริบิวต์อื่น ๆ - เมธอดและแอตทริบิวต์อื่น ๆ ใน Python หลังจากทั้งหมด ;-)
cls.__mro__
(อย่างน้อยใน Python 3.5)
คลาสสไตล์ใหม่มีเมธอด mro ซึ่งคุณสามารถเรียกใช้ซึ่งส่งคืนรายการของคลาสพาเรนต์ตามลำดับการแก้ไขเมธอด
object
mro
x
เราสามารถรับลำดับการแก้ไขเมธอดด้วยการเรียกที่ type(x).mro()
เราสามารถพิจารณาx
ได้ClassX
ว่าเป็นคลาสพื้นฐานที่มี: ClassX in type(x).mro()
เร็วที่สุดวิธีเพื่อที่จะเห็นพ่อแม่ทุกคนและในการสั่งซื้อเพียงแค่ใช้ในการสร้าง__mro__
กล่าวคือ repr(YOUR_CLASS.__mro__)
>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
เอาท์พุทในการสั่งซื้อ
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>,
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
ที่นั่นคุณมีมัน คำตอบที่ "ดีที่สุด" ตอนนี้มี 182 คะแนน (ขณะที่ฉันกำลังพิมพ์) แต่นี่ง่ายกว่าบางอย่างที่ซับซ้อนสำหรับการวนดูในฐานหนึ่งชั้นในเวลาไม่พูดถึงเมื่อชั้นขยายสองหรือมากกว่าผู้ปกครอง ชั้นเรียน การนำเข้าและใช้งานinspect
เพียงแค่สร้างความสับสนให้กับขอบเขตเท่านั้น จริงๆแล้วมันเป็นความอัปยศที่ผู้คนไม่รู้ว่าจะใช้ตัวบิวด์อิน
ฉันหวังว่านี่จะช่วยได้!
inspect.getmro
เพียงแค่เรียก__mro__
บนวัตถุที่คุณสามารถเห็นในgithub.com/python/cpython/blob/... การใช้ getmro
สร้างโค้ดที่สะอาดและอ่านง่ายขึ้น แม้ว่าการข้ามการเรียกฟังก์ชันจะเร็วขึ้นแน่นอน
ใช้เบสถ้าคุณต้องการให้ผู้ปกครองใช้__mro__
(ตามที่ระบุโดย @ naught101) สำหรับการรับลำดับการแก้ไขเมธอด
ฐาน (และรับคลาสสำหรับวัตถุที่มีอยู่ก่อน):
>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)
สำหรับ mro ในเวอร์ชัน Python ล่าสุด:
>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)
เห็นได้ชัดว่าเมื่อคุณมีคำจำกัดความของคลาสแล้วคุณสามารถโทรหา__mro__
ได้โดยตรงที่:
>>> class A(): pass
>>> A.__mro__
(__main__.A, object)
type(C()).__bases__
ตามที่กล่าวไว้ด้านล่าง