প্রদত্ত শ্রেণীর শ্রেণিবিন্যাসে সমস্ত বেস ক্লাসের তালিকা দাও?


135

একটি শ্রেণি দেওয়া Foo(এটি একটি নতুন ধাঁচের শ্রেণি হোক বা না), উত্তরাধিকার শ্রেণিবিন্যাসের যে কোনও জায়গায় আপনি কীভাবে সমস্ত বেস ক্লাস তৈরি করেন issubclass?

উত্তর:


196

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'>)

2
পাইবজেসি ক্লাসের জন্য কাজ করে না :( ফাইল "/User/rbp/Projects/zzzzzzz/macmdtyype.py", 70 নম্বর লাইন, জালিয়াতি মুদ্রণ পরিদর্শন.getmro (পথ) ফাইল "/ সিস্টেমে / লাইবারি / ফ্রেমওয়ার্কস / পাইথন.ফ্রেমওয়ার্ক / সংস্করণ / ২.7 / লিবি / পাইথন ২. / / ইন্সপেক্ট.পি ", লাইন ৩৪৮, গেটম্রো সার্চবেসে (ক্লাস, ফলাফল) ফাইল" / সিস্টেমে / লাইব্রেরি / ফ্রেমওয়ার্কস / পাইথন.ফ্রেমওয়ার্ক / ভার্সন / ২./ / লিবি / পাইপথন ২..7/ inspect .py ", লাইন 339 সালে CLS .__ bases_ বেস জন্য _searchbases মধ্যে : AttributeError: ' NSTaggedDate' অবজেক্ট কোন অ্যাট্রিবিউট '__bases হয়েছে '
rbp

17
@ আরবিপি আমার সন্দেহ হয় যে আমারও একই সমস্যা হয়েছিল যার মুখোমুখি হয়েছিল: আপনি এর inspect.getmro(obj)পরিবর্তে চেষ্টা করার চেষ্টা করছিলেন inspect.getmro(type(obj))
এএমিট করুন

44

একটি অজগরটিতে উপলব্ধ __bases__সম্পত্তিটি দেখুন class, যেখানে ঘাঁটি শ্রেণীর একটি অংশ রয়েছে:

>>> 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>]

5
এটি সদৃশ পরিচয় দিতে পারে। এবং এ কারণেই ডকুমেন্টেশনের জন্য getmroস্পষ্টভাবে বলা হয়েছে "এই টিপলটিতে কোনও শ্রেণি একাধিকবার প্রদর্শিত হয় না"?
শ্রীধর রত্নাকুমার

10
সাবধানতা, __bases__কেবল এক স্তর উপরে যায় । (যেমন আপনার পুনরাবৃত্তি ইউটিলিটি বোঝায়, তবে উদাহরণে একটি অবিশ্বাস্য দৃষ্টিভঙ্গি সম্ভবত এটি গ্রহণ না করতে পারে))
বব স্টেইন

32

inspect.getclasstree()ক্লাস এবং তাদের বেসগুলির একটি নেস্টেড তালিকা তৈরি করবে। ব্যবহার:

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.

1
ওহ, সুন্দর। এমনকি আরও ভাল আউটপুট জন্য, প্রিন্ট ব্যবহার করুন! python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
পেঙ্গুইন 359

20

আপনি __bases__ক্লাস অবজেক্টের টিপল ব্যবহার করতে পারেন :

class A(object, B, C):
    def __init__(self):
       pass
print A.__bases__

ফিরে আসা টিপলটির __bases__সমস্ত বেস ক্লাস রয়েছে।

আশা করি এটা সাহায্য করবে!


যদি আপনার ক্লাসটি ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত বর্গ থেকে প্রাপ্ত হয়, তবে চেইনের কেবল প্রথম অংশটি এতে থাকবে__bases__
বরিস

একক ফাংশনের জন্য পুরো মডিউলটি আমদানি না করে সহজ এবং পরিষ্কার।
টেম্পেরোসা

8

পাইথন ৩.7 এ আপনাকে পরিদর্শন করতে হবে না, টাইপ.ম্রো আপনাকে ফলাফল দেবে।

>>> class A:
...   pass
... 
>>> class B(A):
...   pass
... 
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>

মনোযোগ দিন যে পাইথন 3.x এ প্রতিটি শ্রেণি অবজেক্ট ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত।


8

পাইথন ডকের মতে , আমরা সহজেই 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

2

যদিও জোচেনের উত্তরটি খুব সহায়ক এবং সঠিক, আপনি যেমন পরিদর্শন মডিউলটির .getmro () পদ্ধতিটি ব্যবহার করে শ্রেণি শ্রেণিবিন্যাস অর্জন করতে পারেন, পাইথনের উত্তরাধিকারের স্তরক্রম নীচে নিম্নরূপ: হাইলাইট করাও গুরুত্বপূর্ণ:

উদা:

class MyClass(YourClass):

উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণি

  • শিশুশ্রেণী
  • উত্সর্গীকৃত ক্লাস
  • উপশ্রেণী

উদা:

class YourClass(Object):

উত্তরাধিকারসূত্রে প্রাপ্ত শ্রেণি

  • অভিভাবক শ্রেণি
  • বেস ক্লাস
  • সুপারক্লাস

একটি শ্রেণি অন্যের কাছ থেকে উত্তরাধিকারী হতে পারে - শ্রেণিটির 'বংশগতভাবে উত্তরাধিকারসূত্রে প্রাপ্ত হয় - বিশেষত, এর পদ্ধতিগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হয় - এর অর্থ হ'ল উত্তরাধিকারসূত্রে (শিশু) বর্গের উত্তরাধিকারী (পিতামাতা) শ্রেণীর বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারে

উদাহরণস্বরূপ -> শ্রেণী -> তারপরে উত্তরাধিকার সূত্রে প্রাপ্ত ক্লাসগুলি

ব্যবহার

import inspect
inspect.getmro(MyClass)

পাইথনের মধ্যে আপনাকে শ্রেণিবিন্যাস প্রদর্শন করবে show

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.