เมื่อพิจารณาถึงคลาสFoo
(ไม่ว่าจะเป็นคลาสสไตล์ใหม่หรือไม่ก็ตาม) คุณจะสร้างคลาสพื้นฐานทั้งหมดได้อย่างไร- ที่ใดก็ได้ในลำดับชั้นการสืบทอด - issubclass
จาก?
เมื่อพิจารณาถึงคลาสFoo
(ไม่ว่าจะเป็นคลาสสไตล์ใหม่หรือไม่ก็ตาม) คุณจะสร้างคลาสพื้นฐานทั้งหมดได้อย่างไร- ที่ใดก็ได้ในลำดับชั้นการสืบทอด - issubclass
จาก?
คำตอบ:
inspect.getmro(cls)
ใช้ได้กับทั้งคลาสสไตล์ใหม่และแบบเก่าและส่งกลับค่าเดียวกันกับNewClass.mro()
: รายการคลาสและคลาสบรรพบุรุษทั้งหมดตามลำดับที่ใช้สำหรับวิธีการแก้ปัญหา
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
inspect.getmro(obj)
inspect.getmro(type(obj))
ดู__bases__
คุณสมบัติที่มีอยู่ใน python class
ซึ่งมี tuple ของคลาสฐาน:
>>> def classlookup(cls):
... c = list(cls.__bases__)
... for base in c:
... c.extend(classlookup(base))
... return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]
getmro
ระบุอย่างชัดเจนว่า "ไม่มีชั้นเรียนปรากฏมากกว่าหนึ่งครั้งในทูเพิลนี้"?
__bases__
เพิ่มขึ้นหนึ่งระดับเท่านั้น (ตามที่ยูทิลิตีเรียกซ้ำของคุณบอกเป็นนัย ๆ แต่การมองคร่าวๆที่ตัวอย่างอาจไม่เข้าใจ)
inspect.getclasstree()
จะสร้างรายการชั้นเรียนและฐานที่ซ้อนกัน การใช้งาน:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
คุณสามารถใช้__bases__
ทูเพิลของคลาสออบเจ็กต์:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
ทูเปิลที่ส่งคืน__bases__
มีคลาสพื้นฐานทั้งหมด
หวังว่าจะช่วยได้!
__bases__
ใน python 3.7 คุณไม่จำเป็นต้องนำเข้าการตรวจสอบ type.mro จะให้ผลลัพธ์
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
ให้ความสนใจว่าใน python 3.x ทุกคลาสสืบทอดมาจากคลาสอ็อบเจ็กต์พื้นฐาน
ตามเอกสาร Pythonเราสามารถใช้class.__mro__
แอตทริบิวต์หรือclass.mro()
วิธีการ:
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True
แม้ว่าคำตอบของ Jochen จะมีประโยชน์และถูกต้องมากเนื่องจากคุณสามารถรับลำดับชั้นของคลาสได้โดยใช้เมธอด. getmro () ของโมดูลการตรวจสอบสิ่งสำคัญคือต้องเน้นว่าลำดับชั้นการสืบทอดของ Python มีดังนี้:
เช่น:
class MyClass(YourClass):
คลาสที่สืบทอด
เช่น:
class YourClass(Object):
คลาสที่สืบทอดมา
คลาสหนึ่งสามารถสืบทอดจากคลาสอื่นได้ - แอตทริบิวต์ของคลาสนั้นได้รับการสืบทอด - โดยเฉพาะเมธอดของมันจะได้รับการสืบทอด - ซึ่งหมายความว่าอินสแตนซ์ของคลาสที่สืบทอด (ลูก) สามารถเข้าถึงที่มาของคลาสที่สืบทอด (พาเรนต์)
อินสแตนซ์ -> คลาส -> แล้วสืบทอดคลาส
โดยใช้
import inspect
inspect.getmro(MyClass)
จะแสดงลำดับชั้นภายใน Python