मेरे पास एक वर्ग है, और इसमें एक ताना है। मैं "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()
2
Linghao.Chen 4 जुलाई 2019, 12:16

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__

6
RomanPerekhrest 4 जुलाई 2019, 12:23

आप __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
1
U11-Forward 4 जुलाई 2019, 12:23

__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)
0
Victor Ruiz 4 जुलाई 2019, 13:03