2017-06-09 12 views
5

मेरे पास कक्षाएक वर्ग परिवर्तनीय remote है। क्या मैं self.remote का उपयोग कर कक्षा चर remote तक पहुंच सकता हूं?क्या मैं स्वयं का उपयोग कर कक्षा चर का उपयोग कर सकता हूं?

class Foo: 
    remote = False 

    def __init__(self): 
     self.remote = True 

    @classmethod 
    def print_remote(cls): 
     print(cls.remote) #prints False but why? 
+1

आपके पास 'रिमोट 'के * वर्ग स्तर * और * उदाहरण स्तर * दोनों हैं - आप वास्तव में क्या करने की कोशिश कर रहे हैं? –

+0

मैं जानना चाहता हूं कि self.remote और cls.remote समान चर या अलग हैं या नहीं। – 2ank3th

उत्तर

7

__init__ में self करने के लिए remote नियत मतलब यह है कि instance.remote पहले जब आप इसे self के माध्यम से पहुँच (दी कोई वर्णनकर्ता के आसपास रहे हैं) पाया जाता है। दोनों विकल्पों, या तो self से या type(self) से पहुँच प्राप्त करने के लिए, वह यह है कि, या तो उदाहरण या वर्ग से:

def print_remote(self): 
    print(type(self).remote) # class remote 
    print(self.remote)  # instance remote 

type(self).remote, अनिवार्य रूप से self.__class__.remote के बराबर है, लेकिन सामान्य रूप में, है आप दुंदर नाम हथियाने से बचना चाहिए (__*__) वहाँ जब इस मामले में आप के लिए यह करता है कि में बनाया गया एक (type)

इन विभिन्न शब्दकोशों में रहते हैं और विभिन्न चर रहे हैं। self.remote कक्षा के निर्देश में class.remote के दौरान उदाहरण के क्रम में रहता है।

>>> Foo().__dict__['remote'] 
True 
>>> Foo.__dict__['remote'] 
False 

आप (एक सामान्य विधि में या type(self)) एक classmethod साथ cls के माध्यम से पहुँच प्राप्त करते हैं जब आप self के माध्यम से पहुँच आप कक्षा एक मिल जाएगा आप उदाहरण के एक मिलता है।

+1

'रिमोट' चर दोनों को स्वीकार करने में सक्षम होना अच्छा लगता है, लेकिन मुझे यह तथ्य पसंद नहीं है कि दो अलग-अलग चीजों का एक ही नाम है। उदाहरण के सदस्यों के लिए व्यापक रूप से उपयोग किए गए 'm_' नोटेशन के संबंध में, मैं' c_' के साथ अपने वर्ग चर को उपसर्ग करना चाहता हूं। यह 'self.remote' जैसे कॉल को असंबद्ध करता है, जो या तो' self.c_remote' या 'self.m_remote' बन जाता है। –

+0

ग्रेट स्पष्टीकरण धन्यवाद। – 2ank3th

+0

यह भी ध्यान दें कि 'स्वयं .__ वर्ग __। दूरस्थ' 'प्रकार (स्वयं) .remote' के बराबर है। –

1

हां, आप स्वयं के साथ वर्ग चर का उपयोग कर सकते हैं। लेकिन, यदि आपके पास एक इंस्टेंस वैरिएबल है, तो आप इंस्टेंस वैरिएबल तक पहुंचेंगे जब आप स्वयं का उपयोग करते हैं क्योंकि यह क्लास वैरिएबल को छाया कर रहा है।

3
In [1]: class Foo: 
    ...:  x = 0 
    ...: 

In [2]: f = Foo() 

In [4]: f.__dict__ # empty 
Out[4]: {} 

In [5]: Foo.__dict__ # have the variable x = 0 
Out[5]: 
mappingproxy({'__dict__': <attribute '__dict__' of 'Foo' objects>, 
       '__doc__': None, 
       '__module__': '__main__', 
       '__weakref__': <attribute '__weakref__' of 'Foo' objects>, 
       'x': 0}) 

जब आप एक वस्तु में एक चर का उपयोग करने की कोशिश, अजगर पहली वस्तु में, देखने के लिए अगर यह वहाँ तो नहीं है, यह वर्ग dict में लग रहा है।

In [6]: Foo.x = 10 # changing class variable 

In [7]: f.__dict__ # still empty. 
Out[7]: {} 

In [8]: f.x # gives you Foo's x as object doesn't have that item. 
Out[8]: 10 

In [9]: f.x = 20 # this line creates a new variable in x. Now both class and object has their own variable x 

In [10]: f.__dict__ # f has its own x. 
Out[10]: {'x': 20} 

In [11]: Foo.__dict__ # Foo has its own x. 
Out[11]: 
mappingproxy({'__dict__': <attribute '__dict__' of 'Foo' objects>, 
       ... 
       'x': 10}) 
In [12]: f.x # always you will get the value from f.__dict__ 
Out[12]: 20 
In [16]: f.x = 50 # changing the value of object's variable 

In [17]: Foo.x # above statement didn't affect class's variable. 
Out[17]: 10 

In [13]: del f.x # delete object's x 

In [14]: f.x # now f doesn't have x, you get the value from class Foo. 
Out[14]: 10 
संबंधित मुद्दे

 संबंधित मुद्दे