मेरे पास एक वर्ग है, और इसमें एक ताना है। मैं "instance.d [कुंजी]" के बजाय सीधे "instance.key" द्वारा ताना में चर पर जाना चाहता हूं। उसको कैसे करे?
class A:
def __init__(self):
self.a = 1
self.b = 2
self.fields = {'c': 3, 'd': 4}
def main():
a = A()
print(a.a) # 1
print(a.b) # 2
print(a.c) # currently raise Exception, I want it to print 3
print(a.d) # currently raise Exception, I want it to print 4
if __name__ == '__main__':
main()
3 जवाब
आप object.__getattr__(self, name)
विधि को ओवरराइड करने में सक्षम हैं (ऐसी विधियों को वर्ग उदाहरणों के लिए विशेषता पहुंच के अर्थ को अनुकूलित करने के लिए परिभाषित किया जा सकता है):
class A:
def __init__(self):
self.a = 1
self.b = 2
self.fields = {'c': 3, 'd': 4}
def __getattr__(self, item):
return self.__dict__.get(item) or self.__dict__['fields'].get(item)
a = A()
print(a.a) # 1
print(a.b) # 2
print(a.c) # 3
print(a.d) # 4
संदर्भ लिंक: __getattr__
आप __dict__
को भी संशोधित कर सकते हैं:
class A:
def __init__(self):
self.a = 1
self.b = 2
self.fields = {'c': 3, 'd': 4}
self.__dict__ = {**self.__dict__, **self.fields}
और अब:
def main():
a = A()
print(a.a)
print(a.b)
print(a.c)
print(a.d)
if __name__ == '__main__':
main()
देता है:
1
2
3
4
__getattr__
को @RomanPerekhrest के सुझाव के अनुसार लागू करें। आपके पास एकमात्र समस्या यह हो सकती है कि आपकी आवृत्ति विशेषताएँ आपकी ताना प्रविष्टियों को ओवरराइड करती हैं। यदि वह अपेक्षित व्यवहार नहीं है, तो आपको __getattr__
के बजाय __getattribute__
लागू करना चाहिए
कुछ इस तरह:
class A:
def __init__(self):
self.a = 1
self.b = 2
self.e = 5
self.fields = {'c': 3, 'd': 4, 'e': 6}
def __getattribute__(self, key):
fields = super().__getattribute__('fields')
if key == 'fields':
return fields
try:
return fields[key]
except KeyError:
return super().__getattribute__(key)
a = A()
print(a.a) # 1
print(a.b) # 2
print(a.c) # 3
print(a.d) # 4
print(a.e) # 6 (Note that it returns the entry of the dict rather that the instance attribute)
print(a.f) # Raises exception (not in the instance attributes nor in the dict)
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।