मेरे पास अगला कोड है:

class PythagoreanProof(Scene):
    CONFIG={
    "color_triangulos":YELLOW,
    "color_rect_c":RED,
    "color_rect_b":ORANGE,
    "color_rect_a":ORANGE,
    "color_cuadrado_c":ORANGE,
    "opacidad_triangulos":0.6,
    "opacidad_cuadradro_a":0.6,
    "opacidad_cuadradro_b":0.6,
    "opacidad_cuadradro_c":0.6,
    "grosor_lineas":1,
    "l_a":5/5,
    "l_b":12/5,
    "l_c":13/5,
    }
    def construct(self):
        self.wait()
        self.pre_cuadrado()
        self.pos_cuadrado()
        self.tran_pre_pos_cuadrado()
        self.wait()

    def pre_cuadrado(self):
        cuadro=Square(side_length=self.l_a+self.l_b)

जैसा कि आप देख सकते हैं, मैं "l_a" कुंजी को self.l_a के माध्यम से एक्सेस कर सकता हूं

लेकिन इस बहुत आसान कोड में मुझे निम्न त्रुटि मिलती है:

class Example():
     CONFIG = {'spam':25}

     def __init__(self, value):
         self.data = value 

         def display(self):
             print(self.data, self.spam)  

x=Example(2)
x.display()

AttributeError: 'Example' object has no attribute 'spam'

यह पहले उदाहरण में क्यों काम करता है? यह वास्तव में कैसे काम करता है?

धन्यवाद!

0
Ilya_Curie 27 फरवरी 2020, 07:09
6
Scene वर्ग में कुछ ऐसा होना चाहिए जो इसे self.XXX से self.CONFIG[XXX] में अनुवाद करे, आपकी दूसरी कक्षा Scene से विरासत में नहीं मिली है, इसलिए यह ऐसा नहीं करती है।
 – 
Barmar
27 फरवरी 2020, 07:11
1
ध्यान दें, वह ताना स्थानीय नहीं है, यह एक वर्ग-स्तरीय चर है (एक आवृत्ति चर नहीं)। ठीक है, पांडित्य होने के लिए, यह क्लास डेफिनिशन स्टेटमेंट के निष्पादन के दौरान क्लास बॉडी स्कोप के लिए स्थानीय है, लेकिन स्टेटमेंट के निष्पादित होने के बाद यह स्कोप मौजूद नहीं रहता है
 – 
juanpa.arrivillaga
27 फरवरी 2020, 07:16
लेकिन मैंने अन्य मॉड्यूल में देखा है, क्लास-स्तरीय चर के रूप में डिक्ट्स को उपयोगकर्ता की इच्छा के रूप में संशोधित किया गया है।
 – 
Ilya_Curie
27 फरवरी 2020, 07:55
@juanpa.arrivillaga
 – 
Ilya_Curie
27 फरवरी 2020, 07:55
हम केवल अनुमान लगा सकते हैं, ऐसे कई तरीके हो सकते हैं जो हो सकते हैं (जैसा कि आपका दूसरा कोड प्रदर्शित करता है, यह डिफ़ॉल्ट रूप से नहीं होता है)। यह निश्चित रूप से विरासत में मिली किसी चीज़ का परिणाम है: class PythagoreanProof(Scene): आपको एक न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण प्रदान करना होगा या , फिर से, केवल अटकलें लगाई जा सकती हैं और यह सूत्रबद्ध विषय पर नहीं है।
 – 
juanpa.arrivillaga
27 फरवरी 2020, 08:39

2 जवाब

जब Scene को PythagoreanProof वर्ग में विरासत में मिला है तो क्यों काम करता है, आपको यह देखने के लिए Scene के कोड पर एक नज़र डालने की आवश्यकता है कि यह वास्तव में क्या कर रहा है।

कक्षा Example में आपने CONFIG को एक वर्ग स्तरीय वस्तु के रूप में परिभाषित किया है। आपकी विधि display को इस ऑब्जेक्ट को self.CONFIG के साथ इंगित करना होगा और फिर '25' का मान प्राप्त करने के लिए कुंजी 'स्पैम' का उपयोग करना होगा।

CONFIG विशेषताओं में कुंजी बनाने के लिए आप @poperty आवरण का उपयोग कर सकते हैं।

नीचे उदाहरण देखें

class Example():
    CONFIG = {'spam': 25}

    def __init__(self, value):
        self.data = value

    def display(self):
        print(self.data, self.CONFIG['spam'])

    @property
    def spam(self):
        return self.CONFIG['spam']

x = Example(2)
x.display()
print(x.spam)
2 25
25

ध्यान दें कि आप में से कुछ पहचानकर्ता गलत हैं। विधि display __init__ के तहत एक फ़ंक्शन नहीं होना चाहिए, लेकिन कक्षा Example के अंतर्गत एक विधि होनी चाहिए।

0
Bruno Vermeulen 27 फरवरी 2020, 14:28

मुझे संदेह है कि Scene वर्ग में कुछ जादू है जो __getattr__ विधि के साथ खेलता है। इस कदर :

class Scene:
    # Minimalistic example.
    # See https://docs.python.org/3.8/reference/datamodel.html#object.__getattr__
    def __getattr__(self, name):
        return self.CONFIG[name]


class Example(Scene):
    CONFIG = {'spam': 25}

    def __init__(self, value):
        self.data = value

    def display(self):
        print(self.data, self.spam)


x = Example(2)
x.display()
# -> 2 25
0
glenfant 27 फरवरी 2020, 14:39