अजगर - एक कक्षा में "स्व" का उपयोग क्यों करें?


82

ये 2 वर्ग कैसे भिन्न होते हैं?

class A():
    x=3

class B():
    def __init__(self):
        self.x=3

क्या कोई महत्वपूर्ण अंतर है?


6
नहीं, यह कोई डुप्लिकेट नहीं है।

1
@ एचओपी: दिलचस्प दावा है, लेकिन आपने कोई उदाहरण या सबूत नहीं दिया है कि यह डुप्लिकेट नहीं है। तुमने ऐसा क्यों कहा?
एस.लॉट

2
@ S.Lott - हुह? दूसरा प्रश्न पूछ रहा है कि हमें स्पष्ट रूप से स्वयं को पारित करने की आवश्यकता क्यों है। यह एक अंतर के बारे में पूछ रहा है क्योंकि वर्ग और उदाहरण चर।
दाना

1
@ S.Lott यही सवाल नहीं है। मैंने भी पूछने से पहले उस पर एक नजर डाली।
राईगूी

2
@ एस.लॉट: 68282 इस बारे में एक बेकार सवाल है कि आपको स्पष्ट रूप से स्वयं को पहले तर्क के तरीकों के रूप में क्यों रखना है; यह प्रश्न कक्षा और उदाहरण के सदस्यों के बीच अंतर के बारे में पूछता है। एस.लॉट, मैं वास्तव में एसओ में आपके योगदान को पसंद करता हूं, लेकिन इस बार आप गलत हैं।

जवाबों:


137

A.xएक वर्ग चर हैBके self.xएक है उदाहरण चर

यानी Aकी xउदाहरणों के बीच साझा किया जाता है।

किसी ऐसी चीज़ के साथ अंतर प्रदर्शित करना आसान होगा जिसे सूची की तरह संशोधित किया जा सकता है:

#!/usr/bin/env python

class A:
    x = []
    def add(self):
        self.x.append(1)

class B:
    def __init__(self):
        self.x = []
    def add(self):
        self.x.append(1)

x = A()
y = A()
x.add()
y.add()
print("A's x:", x.x)

x = B()
y = B()
x.add()
y.add()
print("B's x:", x.x)

उत्पादन

A's x: [1, 1]
B's x: [1]

8
हो सकता है कि आपकी स्क्रिप्ट का आउटपुट भी पोस्ट किया जाए, फिर कोई इसे कॉपी किए बिना और अपने आप को चलाने के बिना अंतर देख सकता है ...
मार्टिन

2
क्या अजगर का स्व जावा के बराबर है? कृपया महानुभावों का बहाना करें
जीन

2
@ जीन - हाँ-ईश - स्व को उदाहरण के तरीकों के पहले पैरामीटर को दिया गया पारंपरिक नाम होना चाहिए - और अजगर स्पष्ट रूप से उदाहरण के तरीकों के वर्तमान तर्क को उदाहरणों के तरीकों के पहले तर्क के रूप में पारित करता है। लेकिन यह जावा के समान काम करता है
डगलस लीडर

@ जीन एज़ोपार्डी: स्व लगभग जावा (और c ++) की तरह है। स्व को बस आवश्यकता है; यह कभी-कभी जावा संकलक (दूसरी बार इसकी आवश्यकता है) द्वारा तर्क दिया जाता है।
एस.लॉट

@ डगलस लीडर - कोई बात नहीं।
UnwwnTech

56

बस एक पक्ष नोट के रूप में: selfवास्तव में सिर्फ एक अनियमित रूप से चुने शब्द, कि हर कोई उपयोग करता है, लेकिन आप भी इस्तेमाल कर सकते हैं this, fooया myselfया कुछ और आप चाहते हैं, यह सिर्फ एक वर्ग के लिए हर गैर स्थिर विधि के पहले पैरामीटर है। इसका मतलब है कि यह शब्द selfएक भाषा निर्माण नहीं है, बल्कि सिर्फ एक नाम है:

>>> class A:
...     def __init__(s):
...        s.bla = 2
... 
>>> 
>>> a = A()
>>> a.bla
2

1
यह एक जवाब क्यों है और एक टिप्पणी नहीं है
गेब्रियल पीटरसन

23

एक्स एक वर्ग चर है, और ए के सभी उदाहरणों में साझा किया जाएगा, जब तक कि विशेष रूप से एक उदाहरण के भीतर ओवरराइड नहीं किया जाता है। Bx एक उदाहरण चर है, और B के प्रत्येक उदाहरण का अपना संस्करण है।

मुझे आशा है कि निम्नलिखित पायथन उदाहरण स्पष्ट कर सकते हैं:


    >>> class Foo():
    ...     i = 3
    ...     def bar(self):
    ...             print 'Foo.i is', Foo.i
    ...             print 'self.i is', self.i
    ... 
    >>> f = Foo() # Create an instance of the Foo class
    >>> f.bar()
    Foo.i is 3
    self.i is 3
    >>> Foo.i = 5 # Change the global value of Foo.i over all instances
    >>> f.bar()
    Foo.i is 5
    self.i is 5
    >>> f.i = 3 # Override this instance's definition of i
    >>> f.bar()
    Foo.i is 5
    self.i is 3

17

मैं इसे इस उदाहरण से समझाता था

# By TMOTTM

class Machine:

    # Class Variable counts how many machines have been created.
    # The value is the same for all objects of this class.
    counter = 0

    def __init__(self):

        # Notice: no 'self'.
        Machine.counter += 1

        # Instance variable.
        # Different for every object of the class.
        self.id = Machine.counter

if __name__ == '__main__':
    machine1 = Machine()
    machine2 = Machine()
    machine3 = Machine()

    #The value is different for all objects.
    print 'machine1.id', machine1.id
    print 'machine2.id', machine2.id
    print 'machine3.id', machine3.id

    #The value is the same for all objects.
    print 'machine1.counter', machine1.counter
    print 'machine2.counter', machine2.counter
    print 'machine3.counter', machine3.counter

आउटपुट तब होगा

machine1.id 1
मशीन २.द २
मशीन ३.द ३

मशीन 1। मुठभेड़ 3
मशीन 2। मुठभेड़ 3
मशीन 3। मुठभेड़ 3

3

मैंने अभी पायथन सीखना शुरू किया है और इसने मुझे कुछ समय के लिए भ्रमित कर दिया है। यह पता लगाने की कोशिश की जा रही है कि यह सब सामान्य रूप से कैसे काम करता है मैं इस बहुत ही सरल कोड के साथ आया:

# Create a class with a variable inside and an instance of that class
class One:
    color = 'green'

obj2 = One()


# Here we create a global variable(outside a class suite).
color = 'blue'         

# Create a second class and a local variable inside this class.       
class Two:             
    color = "red"

    # Define 3 methods. The only difference between them is the "color" part.
    def out(self):     
        print(self.color + '!')

    def out2(self):
        print(color + '!')

    def out3(self):
        print(obj2.color + '!')

# Create an object of the class One
obj = Two()

जब हम फोन out()करते हैं तो हमें मिलता है:

>>> obj.out()

red!

जब हम कॉल करते हैं out2():

>>> obj.out2()

blue!

जब हम कॉल करते हैं out3():

>>> obj.out3()

green!

तो, पहली विधि में selfनिर्दिष्ट किया गया है कि पायथन को चर (विशेषता) का उपयोग करना चाहिए, जो कि हमारे द्वारा बनाई गई वर्ग वस्तु के लिए "संबंधित" है, न कि एक वैश्विक (वर्ग के बाहर)। तो यह उपयोग करता है color = "red"। विधि में पायथन ने स्पष्ट रूप से selfहमारे द्वारा बनाई गई वस्तु ( obj) के नाम का विकल्प दिया है । self.colorइसका मतलब है "मैं हो रही है color="red"से obj"

दूसरी विधि में selfउस ऑब्जेक्ट को निर्दिष्ट करने के लिए कोई भी नहीं है जहां से रंग लिया जाना चाहिए, इसलिए इसे वैश्विक मिल जाता है color = 'blue'

तीसरी विधि में selfहमने प्रयोग किया obj2- किसी अन्य वस्तु का एक नाम जिससे प्राप्त colorकिया जा सके। यह हो जाता है color = 'green'

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.