পাইথন ক্লাসের পিতামাতাদের কীভাবে পাবেন?


201

আমি কীভাবে পাইথন ক্লাসের প্যারেন্ট ক্লাস (এস) পেতে পারি?

উত্তর:


232

নিম্নলিখিত বৈশিষ্ট্যটি ব্যবহার করুন:

cls.__bases__

দস্তাবেজগুলি থেকে :

একটি শ্রেণীর অবজেক্টের বেস শ্রেণির টিপল।

উদাহরণ:

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

1
তাত্ক্ষণিকভাবে অবজেক্টের ভিত্তি পেতে type(C()).__bases__আরও নীচে উল্লিখিত হিসাবে করুন
সিটিএনরম্যান

105

আপনি যদি কেবল তাত্ক্ষণিকের চেয়ে সমস্ত পূর্বপুরুষদের চান তবে ইন্সপেক্ট.টেমরো ব্যবহার করুন :

import inspect
print inspect.getmro(cls)

কার্যকরভাবে, এটি আপনাকে "পদ্ধতি সমাধানের আদেশে" সমস্ত পূর্বপুরুষ শ্রেণি দেয় - অর্থাত্ কোনও পদ্ধতি সমাধান করার সময় পূর্বপুরুষদের পরীক্ষা করা হবে (বা, আসলে, অন্য কোনও বৈশিষ্ট্য - পদ্ধতি এবং অন্যান্য বৈশিষ্ট্য একই নামস্থানে বাস করে) পাইথনে, সর্বোপরি ;-)।


33
আপনি কেবল ব্যবহার করতে পারেন cls.__mro__(কমপক্ষে পাইথন 3.5 তে)
নট 101

@ naught101, plz এটি একটি সম্পূর্ণ উত্তরে রূপান্তরিত করে। আমি এটি প্রায় মিস করেছি, এবং তাই হবে, আমি অন্য অনেক লোককে মনে করি।
শিহাব শাহরিয়ার খান

14

নতুন স্টাইলের ক্লাসগুলির একটি ম্রো পদ্ধতি রয়েছে আপনি কল করতে পারেন যা পদ্ধতি রেজোলিউশন ক্রমে পিতামাতাদের ক্লাসগুলির একটি তালিকা প্রদান করে।


নতুন শৈলীর শ্রেণি হিসাবে কী গণনা করা হয়? দেখে মনে হচ্ছে আমি জাঙ্গো মডেলগুলির সাথে এটি ব্যবহার করতে পারি তবে কেবল উত্তরাধিকার সূত্রে প্রাপ্ত কোনও কিছুর objectপ্রতিক্রিয়া বলে মনে হচ্ছে না mro
ব্রায়ান কুং

1
একটি বস্তু বিবেচনা x, আমরা কলের মাধ্যমে পদ্ধতি রেজল্যুশন অর্ডার পেতে পারেন type(x).mro() যদি আমরা বিবেচনা করতে পারেন xহয়েছে ClassX: সঙ্গে একটি বেস শ্রেণী হিসেবে ClassX in type(x).mro()
648trindade

13

সবচেয়ে দ্রুততায় পথ, সব বাবারা দেখতে, এবং এ আদেশ শুধু সালে নির্মিত ব্যবহার__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অপ্রয়োজনীয়ভাবে কেবল মেঘকে আমদানি করা এবং ব্যবহার করা । এটি সত্যই লজ্জাজনক যে লোকেরা কেবল বিল্ট-ইনগুলি ব্যবহার করতে জানেন না

আশা করি এটা কাজে লাগবে!


স্মিথ @John stackoverflow.com/users/139885/john-smith , আশা করি আপনি এই উত্তর দেখুন। আপনি যদি এটি পছন্দ করেন তবে দয়া করে আমাকে একটি উক্তি দিয়ে জানান!
পাইটিস

1
বাস্তবে, inspect.getmroকেবল __mro__অবজেক্টে কল করুন, আপনি github.com/python/cpython/blob/… এ দেখতে পাচ্ছেন । ব্যবহার getmroক্লিনার এবং আরও পঠনযোগ্য কোড উত্পাদন করে। যদিও একটি ফাংশন কল এড়ানো সত্যিই দ্রুত।
tna0y

9

যদি আপনি কেবল পিতামাতাদের পেতে চান তবে ব্যবহার করুন __mro__বেসগুলি পদ্ধতি রেজোলিউশন অর্ডার পাওয়ার জন্য (@ নন্ট 101 দ্বারা নির্দেশিত হিসাবে) ব্যবহার করুন (যাতে এনআরটি কোন আদেশে কার্যকর করা হয়েছিল তা জানতে)।

বেসগুলি (এবং একটি বিদ্যমান অবজেক্টের জন্য প্রথম শ্রেণীর প্রাপ্তি):

>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)

সাম্প্রতিক পাইথন সংস্করণগুলিতে ম্রোর জন্য:

>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)

স্পষ্টতই, যখন আপনি ইতিমধ্যে শ্রেণীর সংজ্ঞা রেখেছেন, আপনি কেবল __mro__সরাসরি এটিতে কল করতে পারেন :

>>> class A(): pass
>>> A.__mro__
(__main__.A, object)

3

আপনি যদি তাদের সবাইকে কল করাতে চান তা নিশ্চিত করতে চান, superসমস্ত স্তরে ব্যবহার করুন ।


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