পাইথনের একটি শ্রেণীর সমস্ত সদস্য ভেরিয়েবলের উপর লুপিং


91

আপনি ক্লাসে পুনরাবৃত্তযোগ্য সমস্ত ভেরিয়েবলের তালিকা পাবেন কীভাবে? স্থানীয়দের মতো () তবে এক শ্রেণির জন্য

class Example(object):
    bool143 = True
    bool2 = True
    blah = False
    foo = True
    foobar2000 = False

    def as_list(self)
       ret = []
       for field in XXX:
           if getattr(self, field):
               ret.append(field)
       return ",".join(ret)

এই ফিরে আসা উচিত

>>> e = Example()
>>> e.as_list()
bool143, bool2, foo

ব্যবহার কেন ব্যবহার করতে পারবেন না for field in [ self.bool143, self.bool2, self.blah, self.foo, self.foobar2000 ]? এটি কীভাবে হয় যে আপনি ক্লাসের উদাহরণ ভেরিয়েবলগুলি জানেন না?
এস .লট

4
এস.লোট: যাইহোক আমি কী শেষ করেছি তা স্থির করে। আমার আসল কোডে আমার কাছে 40 টি ভেরিয়েবল রয়েছে, এবং আমি ভেবেছিলাম যে পুনরাবৃত্তির তালিকাটি ম্যানুয়ালি না করা ভাল এবং আরও বেশি ডিআরওয়াই হবে।
পুরোহিত

উত্তর:


152
dir(obj)

আপনাকে বস্তুর সমস্ত বৈশিষ্ট্য দেয় gives পদ্ধতিগুলি ইত্যাদি থেকে আপনাকে নিজেরাই ফিল্টার আউট করতে হবে:

class Example(object):
    bool143 = True
    bool2 = True
    blah = False
    foo = True
    foobar2000 = False

example = Example()
members = [attr for attr in dir(example) if not callable(getattr(example, attr)) and not attr.startswith("__")]
print members   

তোমাকে দিবে:

['blah', 'bool143', 'bool2', 'foo', 'foobar2000']

9
কেন কোনও জিনিস ইনস্ট্যান্ট করুন: স্যার (উদাহরণ ()) কেবল শ্রেণির ধরণের পরিবর্তে দির (উদাহরণ)
এরদাল

8
এবং কিভাবে আপনি মান পেতে?
নটোল

7
@ কুনটোল: গ্যাটট্রা (অবজেক্ট,
অ্যাট্রি

8
কিভাবে callable(attr)কাজ করে? attrস্ট্রিং না ?
cubspl42

6
আপনার ফোন করা উচিত কিনা এর পরিবর্তে আপনার ব্যবহার করা উচিত ছিল vars(Example).items()বা vars(instance.__class__).items()তার পরিবর্তে উচিত ছিল dir()কারণ দির কেবল stringনাম হিসাবে ফিরে আসবে ..
rrw ২

118

আপনি যদি কেবলমাত্র ভেরিয়েবলগুলি (ফাংশন ছাড়াই) ব্যবহার করতে চান তবে:

vars(your_object)

4
আপনি এখনও ফিল্টার প্রয়োজন Vars কিন্তু এই সঠিক উত্তর হল
gaborous

4
এই পদ্ধতির মতো এটি উদাহরণস্বরূপ নেটওয়ার্কের মাধ্যমে রাজ্যগুলি প্রেরণের আগে সিরিয়াল কী তা জানতে এটি ব্যবহার করবে ...
থম

7
varsক্লাস ভেরিয়েবলগুলি অন্তর্ভুক্ত করে না , কেবল উদাহরণ ভেরিয়েবল।
ডিলিথিয়ামম্যাট্রিক্স

4
ক্লাস ভেরিয়েবলগুলি পেতে আপনার ডিলিথিয়ামম্যাট্রিক্সকে ক্লাসে ভার্স (THECLASSITSELF) ব্যবহার করতে হবে। আমার উত্তর নীচে পরীক্ষা করুন।
আমিরহসেইন

4
এই পদ্ধতি ব্যবহার করে বিশেষভাবে ওপি এর প্রশ্নের উত্তর দিতে: members = list(vars(example).keys())(অন্তত python3 মধ্যে) নামে varsএকটি ফেরৎ dictম্যাপিং সদস্য ভেরিয়েবলের নাম এটি এর মান।
মাইকেল হল

28

@ ট্রুপ্পো: আপনার উত্তরটি প্রায় সঠিক, তবে কলযোগ্য সর্বদা মিথ্যা বলে প্রত্যাবর্তন করবে কারণ আপনি কেবল একটি স্ট্রিংয়ে যাচ্ছেন। আপনার নীচের মতো কিছু দরকার:

[attr for attr in dir(obj()) if not callable(getattr(obj(),attr)) and not attr.startswith("__")]

যা কার্যগুলি ফিল্টার করবে out


6
>>> a = Example()
>>> dir(a)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__',
'__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', 'bool143', 'bool2', 'blah',
'foo', 'foobar2000', 'as_list']

আপনি যদি দেখতে পান তবে এটি আপনাকে সমস্ত বৈশিষ্ট্য দেয় , তাই আপনাকে কিছুটা ফিল্টার করতে হবে। তবে মূলত, dir()আপনি যা খুঁজছেন


-1
row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns} if r else {}

এটা ব্যবহার কর.


বিভ্রান্তিকর। ডিফল্টরূপে ক্লাসে কোনও বৈশিষ্ট্য ' টেবিল ' নেই।
ben26941

-2
    class Employee:
    '''
    This class creates class employee with three attributes 
    and one function or method
    '''

    def __init__(self, first, last, salary):
        self.first = first
        self.last = last
        self.salary = salary

    def fullname(self):
        fullname=self.first + ' ' + self.last
        return fullname

emp1 = Employee('Abhijeet', 'Pandey', 20000)
emp2 = Employee('John', 'Smith', 50000)

print('To get attributes of an instance', set(dir(emp1))-set(dir(Employee))) # you can now loop over

-3

এটি করার সহজ উপায় হ'ল একটিতে শ্রেণীর সমস্ত দৃষ্টান্ত সংরক্ষণ করা list

a = Example()
b = Example()
all_examples = [ a, b ]

অবজেক্টগুলি স্বতঃস্ফূর্তভাবে অস্তিত্ব বয়ে যায় না। আপনার প্রোগ্রামের কিছু অংশ একটি কারণে এগুলি তৈরি করেছে। সৃষ্টিটি একটি কারণে করা হয়। এগুলি একটি তালিকায় সংগ্রহ করাও কোনও কারণে করা যেতে পারে।

আপনি যদি কারখানা ব্যবহার করেন তবে আপনি এটি করতে পারেন।

class ExampleFactory( object ):
    def __init__( self ):
        self.all_examples= []
    def __call__( self, *args, **kw ):
        e = Example( *args, **kw )
        self.all_examples.append( e )
        return e
    def all( self ):
        return all_examples

makeExample= ExampleFactory()
a = makeExample()
b = makeExample()
for i in makeExample.all():
    print i

আমি ধারণাটি পছন্দ করি (আমি সম্ভবত এটি কোনও বর্তমান প্রকল্পে ব্যবহার করতে পারি)। এটি প্রশ্নের উত্তর নয়, যদিও: ওপি বৈশিষ্ট্যগুলি তালিকাবদ্ধ করতে চায়, উদাহরণগুলি নিজেরাই নয়।
বালফা

@ বালফা: উফ! প্রশ্নটি পড়েনি। 90% সময়, এটি "একটি ক্লাসের সমস্ত উদাহরণ আমি কীভাবে খুঁজে পাব" এর একটি সদৃশ। আসল প্রশ্ন (এখন আপনি এটি দেখিয়েছেন) বুদ্ধিমানের নয়। আপনি উদাহরণের ভেরিয়েবলগুলি জানেন, কেবল একটি তালিকা তৈরি করুন।
এস .লট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.