आईसी # हम इसे प्रतिबिंब के माध्यम से करते हैं। जावास्क्रिप्ट में यह सरल है:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
इसे पायथन में कैसे करें?
@property
।
आईसी # हम इसे प्रतिबिंब के माध्यम से करते हैं। जावास्क्रिप्ट में यह सरल है:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
इसे पायथन में कैसे करें?
@property
।
जवाबों:
for property, value in vars(theObject).iteritems():
print property, ": ", value
ध्यान रखें कि कुछ दुर्लभ मामलों में __slots__
संपत्ति होती है, ऐसी कक्षाएं अक्सर नहीं होती हैं __dict__
।
__setattr__()
। शब्दकोश पर सीधे मान सेट करना ऑब्जेक्ट के सेटर (और / या उसके माता-पिता) को बायपास करता है। यह अजगर में काफी आम है कि विशेषता सेटिंग (जैसे स्वच्छता) के दौरान आंख से मिलने की तुलना में अधिक चीजें पृष्ठभूमि में हो रही हैं, setattr()
यह सुनिश्चित करने के लिए कि आप याद नहीं करते हैं, या उन्हें अपने आप को संभालने के लिए मजबूर किया जाता है।
vars()
केवल स्थैतिक सदस्यों (यानी, वस्तु की विशेषताओं और विधियों को उस वस्तु के साथ पंजीकृत __dict__
) लौटाता है । यह गतिशील सदस्यों (यानी, वस्तु की विशेषताओं और विधियों को गतिशील रूप से उस वस्तु की विधि या इसी तरह के जादू से परिभाषित नहीं करता है) को वापस नहीं करता है । सभी संभावना में, अपने वांछित संपत्ति गतिशील रूप में परिभाषित किया गया है और इसलिए है नहीं करने के लिए उपलब्ध या । __getattr__()
file.ImplementationName
vars()
dir()
देख लो inspect.getmembers(object[, predicate])
।
किसी वस्तु के सभी सदस्यों को नाम के अनुसार क्रमबद्ध (नाम, मान) जोड़े की सूची में लौटाएं। यदि वैकल्पिक विधेय तर्क की आपूर्ति की जाती है, तो केवल वे सदस्य जिनके लिए विधेय लौटाता है एक सही मूल्य शामिल होता है।
>>> [name for name,thing in inspect.getmembers([])]
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__',
'__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__','__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
>>>
attributes
है members
(क्या दोनों के बीच कोई अंतर है)? वे इसे सुसंगत बनाने के लिए अजगर 3.0 में नाम तय कर सकते थे।
__dict__
, सॉरी।
inspect.getmembers()
लपेटता है और बी प्रेडिकेटेट से मेल नहीं खाने वाले सदस्यों को छोड़कर । हाँ, ठीक है? सामान्य रूप से सभी संभावित ऑब्जेक्ट प्रकारों का समर्थन करने वाले तीसरे पक्ष के पुस्तकालयों के लिए उपयुक्त है। मानक उपयोग के मामलों के लिए, हालांकि, बिल्कुल पर्याप्त है। dir()
inspect.getmembers()
dir()
dir()
सरल तरीका है। यहाँ देखें:
dir()
आपको धन्यवाद देना भूल गया हूं।
__dict__
ऑब्जेक्ट की संपत्ति इसके सभी अन्य परिभाषित गुणों का एक शब्दकोश है। ध्यान दें कि पायथन कक्षाएं गेटअटर को ओवरराइड कर सकती हैं
और ऐसी चीजें बना सकती हैं जो गुणों की तरह दिखती हैं लेकिन अंदर नहीं हैं __dict__
। अंतर्निहित कार्य भी हैं vars()
और dir()
जो सूक्ष्म तरीकों से भिन्न हैं। और कुछ असामान्य कक्षाओं में __slots__
बदल सकता है __dict__
।
पाइथन में ऑब्जेक्ट्स जटिल हैं। __dict__
प्रतिबिंब-शैली प्रोग्रामिंग के लिए शुरू करने के लिए सही जगह है। dir()
यदि आप एक इंटरैक्टिव शेल में चारों ओर हैक कर रहे हैं, तो शुरू करने के लिए जगह है।
print vars.__doc__
इंगित करता है कि With an argument, equivalent to object.__dict__
इसलिए सूक्ष्म अंतर क्या होगा?
georg scholly छोटा संस्करण
print vars(theObject)
यदि आप सभी गुणों के प्रतिबिंब की तलाश कर रहे हैं, तो ऊपर दिए गए उत्तर बहुत अच्छे हैं।
यदि आप केवल एक शब्दकोष (जो कि पायथन में एक 'ऑब्जेक्ट' से अलग है) की कुंजियाँ प्राप्त करना चाहते हैं, तो उपयोग करें
my_dict.keys()
my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']
obj['key']
पहुंचते हैं ( बनाम obj.property
) और सवाल ऑब्जेक्ट प्रॉपर्टीज के बारे में था। मैंने अपना जवाब यहां दिया क्योंकि दोनों के बीच आसान भ्रम है।
यह अन्य उत्तरों द्वारा पूरी तरह से कवर किया गया है, लेकिन मैं इसे स्पष्ट कर दूंगा। एक ऑब्जेक्ट में क्लास एट्रिब्यूट्स और स्टैटिक और डायनेमिक इंस्टेंस विशेषताएँ हो सकती हैं।
class foo:
classy = 1
@property
def dyno(self):
return 1
def __init__(self):
self.stasis = 2
def fx(self):
return 3
stasis
स्थिर है, dyno
गतिशील है (cf. संपत्ति डेकोरेटर) और classy
एक वर्ग विशेषता है। यदि हम बस करते हैं __dict__
या vars
हम केवल स्थैतिक प्राप्त करेंगे।
o = foo()
print(o.__dict__) #{'stasis': 2}
print(vars(o)) #{'stasis': 2}
इसलिए अगर हम चाहते हैं कि दूसरों __dict__
को सब कुछ (और अधिक) मिलेगा। इसमें जादू के तरीके और विशेषताएँ और सामान्य बाध्य विधियाँ शामिल हैं। तो उन लोगों से बचने की सुविधा देता है:
d = {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
print(d) #{'stasis': 2, 'classy': 1, 'dyno': 1}
type
एक संपत्ति सजाया विधि (एक डायनामिक विशेषता) के साथ कहा जाता है आप दिए गए मान के प्रकार देते हैं, नहीं होगा method
। यह साबित करने के लिए आइए जोंस इसे कठोर करें:
import json
print(json.dumps(d)) #{"stasis": 2, "classy": 1, "dyno": 1}
अगर यह एक तरीका होता तो यह दुर्घटनाग्रस्त हो जाता।
टी एल; डॉ। कॉल करने का प्रयास करेंextravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
तीनों के लिए , लेकिन न तो तरीके और न ही जादू।