अजगर में एक वर्ग के सभी सदस्य चर पर पाशन


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
S.Lott: कि क्या मैं वैसे भी कर समाप्त हो गया। मेरे वास्तविक कोड में, मुझे 40 चर पसंद हैं, और मुझे लगा कि इसे बेहतर और अधिक DRY करना होगा ताकि इसे मैन्युअल रूप से पुनरावृत्ति सूची न बनाया जा सके।
पुजारी

जवाबों:


151
dir(obj)

आप वस्तु के सभी गुण देता है। आपको सदस्यों को स्वयं आदि तरीकों से फ़िल्टर करने की आवश्यकता है:

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
किसी वस्तु को तुरंत क्यों: dir (उदाहरण ()) के बजाय सिर्फ वर्ग प्रकार dir (उदाहरण)
Erdal

8
और आपको कैसे मूल्य मिलते हैं?
नॉट

7
@ एक्यूटोल: गेटैट (ऑब्जेक्ट,
एटर

8
कैसे callable(attr)काम करता है ? attrएक तार नहीं है?
क्यूबसप्लू42

6
आप का उपयोग किया जाना चाहिए vars(Example).items()या vars(instance.__class__).items()इसके बजाय dir()अगर आप यह जांचना चाहते हैं कि क्या इसकी कॉल करने योग्य है या नहीं क्योंकि dir केवल stringनामों के रूप में वापस आएगा ..
rrw

117

यदि आप केवल चर (बिना कार्यों के) का उपयोग करना चाहते हैं:

vars(your_object)

5
तुम अब भी फिल्टर की जरूरत वार्स लेकिन यह सही जवाब है
gaborous

3
उदाहरण के लिए नेटवर्क पर राज्यों को भेजने से पहले क्रमबद्धता का पता लगाने के लिए वास्तव में इस दृष्टिकोण का उपयोग करने वाला ...
Thom

7
varsकरता नहीं वर्ग चर, केवल उदाहरण चर शामिल हैं।
Dil लिथियमMatrix

2
@Dil लिथियमMatrix आपको वर्ग वैरिएबल प्राप्त करने के लिए वर्ग पर ही var (THECLASSITSELF) का उपयोग करने की आवश्यकता है। नीचे मेरे जवाब की जाँच करें।
अमीरहोसिन

2
विशेष रूप से ओपी के प्रश्न का उत्तर देने के लिए इस विधि का उपयोग करना: members = list(vars(example).keys())जैसा कि (कम से कम python3 में) इसके मूल्य के लिए सदस्य चर का नाम मैपिंग varsदेता है dict
माइकल हॉल

28

@truppo: आपका उत्तर लगभग सही है, लेकिन कॉल करने योग्य हमेशा झूठा वापस आ जाएगा क्योंकि आप बस एक स्ट्रिंग में गुजर रहे हैं। आपको निम्नलिखित की तरह कुछ चाहिए:

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

जो कार्यों को फ़िल्टर करेगा


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

मुझे यह विचार पसंद आया (मैं वास्तव में वर्तमान परियोजना में इसका उपयोग कर सकता हूं)। यह सवाल का जवाब नहीं है, हालांकि: ओपी विशेषताओं को सूचीबद्ध करना चाहता है, न कि स्वयं उदाहरण।
10

@ अल्लफा: ऊप्स। सवाल नहीं पढ़ा। 90% समय, यह "मैं एक वर्ग के सभी उदाहरणों को कैसे ढूँढूँ" की नकल है। वास्तविक प्रश्न (अब आप इसे इंगित करते हैं) समझदार नहीं है। आप उदाहरण चर जानते हैं, बस एक सूची बनाते हैं।
एस.लॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.