কীভাবে অবজেক্টের পদ্ধতি এবং বৈশিষ্ট্যের সম্পূর্ণ তালিকা পাবেন?


230
dir(re.compile(pattern)) 

তালিকার অন্যতম উপাদান হিসাবে প্যাটার্নটি দেয় না। যথা এটি ফিরে আসে:

['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']

ম্যানুয়াল অনুসারে এটি ধারণ করার কথা

অবজেক্টের বৈশিষ্ট্যগুলির নাম, তার শ্রেণীর বৈশিষ্ট্যগুলির নাম এবং এটির শ্রেণীর বেস ক্লাসগুলির বৈশিষ্ট্যগুলির পুনরাবৃত্তি।

এটিও বলে

তালিকাটি অগত্যা সম্পূর্ণ নয়।

সম্পূর্ণ তালিকা পাওয়ার কোনও উপায় আছে কি ? আমি সবসময় ধরে নিয়েছিলাম যে দির একটি সম্পূর্ণ তালিকা ফিরিয়ে দেয় তবে স্পষ্টতই তা হয় না ...

এছাড়াও: কেবলমাত্র গুণাবলী তালিকাভুক্ত করার কোনও উপায় আছে? নাকি কেবল পদ্ধতি?

সম্পাদনা করুন: এটি আসলে অজগরটিতে একটি বাগ -> সম্ভবত এটি 3.0 শাখায় স্থির করা হয়েছে (এবং সম্ভবত এটি 2.6-এও রয়েছে)


5
dir()মডিউল ব্যবহার বা পরিদর্শন করা সাধারণত এটি করার সঠিক উপায়। আপনি কি reউদাহরণ হিসাবে কেবল মডিউল ব্যবহার করেছেন বা আপনি কোনও বিশেষ লক্ষ্য অর্জন করতে চান?

1
আপনি কি নিশ্চিত যে প্যাটার্নটি আসলে একবার সংকলিত ডেটা হিসাবে রাখা হয়েছিল? আমি এই ছাপে ছিলাম যে একটি প্যাটার্নটি সংকলনের মূল বিষয় হল প্রদত্ত প্যাটার্নটি বিশ্লেষণের জন্য প্রয়োজনীয় সসীম রাজ্য অটোমেটা উত্পাদন করা।
কাইল স্ট্র্যান্ড

@ হুজুর কি ক্লাসের পাশ দিয়ে যেতে পারবেন না? উদাহরণস্বরূপ, তারা তাদের __dir__()
চালাতে পারে

ytpillai: সঠিক, তবে কেবল পাইথন ৩. তবুও, প্রশ্ন রয়েছে, এই জাতীয় শ্রেণি "সাধারণ কেস" এর আওতায় পড়বে কিনা

উত্তর:


140

জন্য সম্পূর্ণ বৈশিষ্ট্যাবলী তালিকা, সংক্ষিপ্ত উত্তর হল: কোন। সমস্যাটি হ'ল বৈশিষ্ট্যগুলি আসলে getattrঅন্তর্নির্মিত ফাংশন দ্বারা গৃহীত আর্গুমেন্ট হিসাবে সংজ্ঞায়িত হয় । যেহেতু ব্যবহারকারী পুনরায় প্রতিস্থাপন করতে পারে __getattr__, হঠাৎ কোনও ধরণের অ্যাট্রিবিউটকে অনুমতি দেয়, সেই তালিকাটি তৈরি করার কোনও জেনেরিক উপায় নেই। dirফাংশনে কী ফেরৎ __dict__গুণ, অর্থাত সব প্রবেশযোগ্য বৈশিষ্ট্যাবলী যদি __getattr__পদ্ধতি reimplemented করা হয় না।

দ্বিতীয় প্রশ্নের জন্য, এটি আসলেই বোঝা যায় না। আসলে, পদ্ধতিগুলি কলযোগ্য বৈশিষ্ট্য, আরও কিছু নয় nothing আপনি কলযোগ্য বৈশিষ্ট্যগুলি ফিল্টার করতে পারেন এবং inspectমডিউলটি বর্গের পদ্ধতি, পদ্ধতি বা ফাংশন নির্ধারণ করে।


1
inpect.getmebers (re.compile (প্যাটার্ন)) সদস্য হিসাবে প্যাটার্ন দেয় না, সুতরাং এটি সম্ভবত অভ্যন্তরীণভাবে dir ব্যবহার করে ... এটি স্তন্যপান!
বার্তোস্জে রাদাচিজিস্কি

আমি কল করার যোগ্য তারা পদ্ধতিগুলি কিনা তা যাচাই করার জন্যও ব্যবহার করতে পারতাম, তবে এটি বিন্দু নয় ... মূল বিষয়টি হ'ল আমি প্রকাশ্যে দৃশ্যমান এমন গুণাবলীর তালিকাটি ফিরিয়ে দিতেও
সাহেবের

2
পরিদর্শন বলতে "কমপক্ষে হিসাবে" দির () এর মতো বিশ্বাসযোগ্য হতে বোঝানো হয়। অন্যদিকে, আবার খুব জটিল মডিউল

"সর্বজনীনভাবে দৃশ্যমান" দ্বারা আপনি কী সংজ্ঞায়িত করেন? যদি আপনার অর্থ "অ্যাক্সেস করা যায়", তবে এটি দেওয়া কারণে একটি হারানো কারণ। অন্যথায়, 'দির' গেটেটরের ডিফল্ট প্রয়োগের সাথে অ্যাক্সেসযোগ্য বৈশিষ্ট্যের তালিকা সর্বদা ফিরিয়ে দেয়।
পিয়েরবিডিআর

2
dir (my_class) my_class থেকে আলাদা কিছু দেয় __ ডিক __। কী ()। সাবেক এছাড়াও মত বর্গ পদ্ধতি আউটপুট Init এবং ডক
JuanPi

58

এজন্য __dir__()পাইথন ২.6- এ নতুন পদ্ধতি যুক্ত করা হয়েছে

দেখা:


আমি এই ত্রুটিটি পেয়েছি: >> দির __ (পাইরেন্ডারডোক) ট্রেসব্যাক (সর্বশেষতম কল শেষ): ফাইল "<string>", লাইন 1, <মডুল> নেম এরর: নাম '__dir ' সংজ্ঞায়িত হয়নি
মোনা জালাল

__dir__ () বস্তুর উপর একটি পদ্ধতি, কোনও ফাংশন নয় - দয়া করে উত্তরের লিঙ্কগুলি এবং এটি পড়ুন
Moe

সমস্ত বৈশিষ্ট্য এবং তাদের মানগুলিকে ছাপানোর জন্য এক-লাইনার:pprint({k:getattr(ojb,k) for k in obj.__dir__()})
স্জ টেকনোলজি

21

এখানে পিয়েরবিডিআর এবং মো এর উত্তরের একটি ব্যবহারিক সংযোজন:

  • পাইথন> = 2.6 এবং নতুন-স্টাইলের ক্লাসগুলির জন্য , dir()যথেষ্ট বলে মনে হচ্ছে।
  • জন্য পুরোনো শৈলী শ্রেণীর , আমরা অন্তত একটা কাজ করতে পারেন মান মডিউল ছাড়াও: সমর্থন ট্যাব সমাপ্তির করে dir(), জন্য বর্ণন __class__, তার জন্য যেতে এবং তারপর __bases__:

    # code borrowed from the rlcompleter module
    # tested under Python 2.6 ( sys.version = '2.6.5 (r265:79063, Apr 16 2010, 13:09:56) \n[GCC 4.4.3]' )
    
    # or: from rlcompleter import get_class_members
    def get_class_members(klass):
        ret = dir(klass)
        if hasattr(klass,'__bases__'):
            for base in klass.__bases__:
                ret = ret + get_class_members(base)
        return ret
    
    
    def uniq( seq ): 
        """ the 'set()' way ( use dict when there's no set ) """
        return list(set(seq))
    
    
    def get_object_attrs( obj ):
        # code borrowed from the rlcompleter module ( see the code for Completer::attr_matches() )
        ret = dir( obj )
        ## if "__builtins__" in ret:
        ##    ret.remove("__builtins__")
    
        if hasattr( obj, '__class__'):
            ret.append('__class__')
            ret.extend( get_class_members(obj.__class__) )
    
            ret = uniq( ret )
    
        return ret

(টেস্ট কোড এবং আউটপুট সংক্ষিপ্ততা মুছে ফেলা হয়, কিন্তু মূলত নতুন স্টাইলের জন্য বস্তু আমরা একই ফলাফল আছে বলে মনে হচ্ছে জন্য get_object_attrs()হিসাবে dir(), এবং পুরানো ধাঁচের শ্রেণীর জন্য প্রধান উপরন্তু dir()আউটপুট হবে বলে মনে হচ্ছে __class__অ্যাট্রিবিউট।)


9

কেবলমাত্র পরিপূরক হিসাবে:

  1. dir()হয় সবচেয়ে ক্ষমতাশালী / মৌলিক হাতিয়ার। ( সর্বাধিক প্রস্তাবিত )
  2. ছাড়া অন্য সলিউশন dir()নিছক প্রদান তাদের পথ ডিল করার আউটপুটdir()

    ২ য় স্তরের বৈশিষ্ট্যগুলি তালিকাবদ্ধ করুন বা না রাখুন, নিজের দ্বারা চালিত হওয়া গুরুত্বপূর্ণ, কারণ কখনও কখনও আপনি আন্ডারস্কোরগুলি শীর্ষস্থানীয় আন্ডারস্কোরগুলির সাহায্যে সন্ধান __করতে পারেন তবে কখনও কখনও আপনার __doc__ডক স্ট্রিংয়ের প্রয়োজন হতে পারে ।

  3. __dir__()এবং dir()অভিন্ন সামগ্রী প্রদান করে returns
  4. __dict__এবং dir()বিভিন্ন। __dict__অসম্পূর্ণ সামগ্রী ফেরত দেয় returns
  5. গুরুত্বপূর্ণ : __dir__()যে কোনও উদ্দেশ্যে লেখক দ্বারা কখনও কখনও কোনও ফাংশন, মান বা টাইপ দিয়ে ওভাররাইট করা যায়।

    এখানে একটি উদাহরণ:

    \\...\\torchfun.py in traverse(self, mod, search_attributes)
    445             if prefix in traversed_mod_names:
    446                 continue
    447             names = dir(m)
    448             for name in names:
    449                 obj = getattr(m,name)

    TypeError: বর্ণনাকারী __dir__এর 'object'অবজেক্ট একটি আর্গুমেন্ট দরকার

    পাইটর্চের লেখক __dir__()পদ্ধতিটি এমন কিছুতে পরিবর্তন করেছেন যার পক্ষে একটি আর্গুমেন্টের প্রয়োজন। এই পরিবর্তন dir()ব্যর্থ করে তোলে ।

  6. আপনি যদি কোনও বস্তুর সমস্ত বৈশিষ্ট্যকে অবিচ্ছিন্ন করার জন্য একটি নির্ভরযোগ্য পরিকল্পনা চান তবে মনে রাখবেন যে প্রতিটি পাইথোনিক মানটি ওভাররাইড হয়ে যেতে পারে এবং ধরে রাখতে পারে না এবং প্রতিটি সম্মেলন অবিশ্বাস্য হতে পারে।


5

এইভাবে আমি এটি করি, সাধারণ কাস্টম অবজেক্টগুলির জন্য দরকারী যেখানে আপনি বৈশিষ্ট্য যুক্ত করে চলেছেন:

দিয়ে তৈরি obj = type("Obj",(object,),{})বা সরাসরি দ্বারা একটি বস্তু দেওয়া :

class Obj: pass
obj = Obj()

কিছু বৈশিষ্ট্য যুক্ত করুন:

obj.name = 'gary'
obj.age = 32

তারপরে, কেবলমাত্র কাস্টম বৈশিষ্ট্যযুক্ত একটি অভিধান পেতে:

{key: value for key, value in obj.__dict__.items() if not key.startswith("__")}

# {'name': 'gary', 'age': 32}

পাইথন 3.x সমস্ত গুণাবলীর তালিকা: {। কী: কী-এর জন্য মান, মান obj .__ অভি __ আইটেম () যদি key.startswith না ( "__")} [_ declared_fields '] কী ()।
above_c_level
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.