मुझे कक्षा के ऑब्जेक्ट्स (पूर्णांक, स्ट्रिंग्स इत्यादि) के अलावा कुछ भी बड़े वर्गों के घटक के साथ एक परियोजना विरासत में मिली है। मैं यह जांचने में सक्षम होना चाहता हूं कि गुणों की सूची मैन्युअल रूप से परिभाषित करने के लिए एक विशेषता मौजूद है या नहीं।पायथन: क्या मानक वाक्यविन्यास का उपयोग करके कक्षा को पुन: सक्षम करना संभव है?
क्या यह पाइथन कक्षा मानक वाक्यविन्यास का उपयोग कर अपने आप को सक्षम कर सकता है? यही है, मैं पहले कक्षा का उदाहरण बनाने के बिना for attr in Foo:
(या यहां तक कि if attr in Foo
) का उपयोग कर कक्षा के सभी विशेषताओं में पुन: प्रयास करने में सक्षम होना चाहता हूं। मुझे लगता है कि मैं __iter__
को परिभाषित करके ऐसा कर सकता हूं, लेकिन अब तक मैंने जो कुछ भी खोजा है, उसमें मैंने काफी प्रबंधन नहीं किया है।
मैं एक __iter__
विधि इतनी तरह जोड़कर जो मैं चाहता से कुछ हासिल कर लिया है:
class Foo:
bar = "bar"
baz = 1
@staticmethod
def __iter__():
return iter([attr for attr in dir(Foo) if attr[:2] != "__"])
बहरहाल, यह काफी की पूर्ति नहीं करता मैं के लिए क्या देख रहा हूँ:
>>> for x in Foo: ... print(x) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'classobj' object is not iterable
फिर भी, यह काम करता है:
>>> for x in Foo.__iter__(): ... print(x) bar baz
अच्छा। कृपया आप समझा सकते हैं कि ओपी का दृष्टिकोण क्यों काम नहीं करता है? धन्यवाद। – NPE
@aix: कारण ओपी का दृष्टिकोण काम नहीं करता है कि '__iter__' विधि केवल कक्षा के * उदाहरण * के लिए काम करती है। यह मेटाक्लास, यानी कक्षा के उदाहरणों तक '__iter__' विधि को बाधित करता है। – nmichaels
@nmichaels यह समझ में आता है, स्पष्टीकरण के लिए धन्यवाद। – NPE