2013-01-16 19 views
7

मैं किसी अन्य फ़ंक्शन के अंदर फ़ंक्शन के अंदर से क्लास वेरिएबल कैसे सेट कर सकता हूं?कक्षा के अंदर एक नेस्टेड फ़ंक्शन के अंदर पायथन स्कॉप?

var.py

class A: 
    def __init__(self): 
     self.a = 1 
     self.b = 2 
     self.c = 3 
    def seta(self): 
     def afunction(): 
      self.a = 4 
     afunction() 
    def geta(self): 
     return self.a 

run.py

cA = A() 
print cA.a 
cA.seta() 
print cA.a 
print cA.geta() 

अजगर run.py

1 
1 
1 

क्यों एक समान नहीं 4 और मैं इसे कैसे बराबर 4 बना सकते है?

धन्यवाद

क्षमा करें, कहा जाता afunction के रूप में अपने मूल कोड - भूल गया।

संपादित करें:

धन्यवाद सबको - क्षमा करें, मैंने अभी देखा है। मैं गलती से अपने नामों में से एक में _ से बंद था .... तो मेरा दायरा वास्तव में ठीक है।

+3

आपने अपने कोड में 'afunction() 'भी नहीं कहा था। –

+6

आपको अपना कोड उत्तर में नहीं बदलना चाहिए। यह अनुपयोगी है, अगर हमें यह देखने के लिए संशोधन करना है कि किस प्रश्न का उत्तर दिया गया था। – TheHerk

उत्तर

6

समस्या यह है कि कई self चर हैं। आपके आंतरिक कार्य में पारित तर्क बाहरी के दायरे को ओवरराइट करता है।

आप आंतरिक फ़ंक्शन से self पैरामीटर को हटाकर इसे दूर कर सकते हैं, और यह सुनिश्चित कर सकते हैं कि आप उस फ़ंक्शन को किसी भी तरह से कॉल करें।

class A: 
    def __init__(self): 
     self.a = 1 
     self.b = 2 
     self.c = 3 
    def seta(self): 
     def afunction(): # no self here 
      self.a = 4 
     afunction()  # have to call the function 
    def geta(self): 
     return self.a 
1

seta के अंदर, आप एक समारोह

def afunction(self): 
     self.a = 4 

परिभाषित ... कि होगा 4 करने के लिए self.a सेट अगर यह कभी कहा जाता। लेकिन इसे कहीं भी नहीं कहा जाता है, इसलिए a अपरिवर्तित है।

2

जैसा कि अन्य ने उल्लेख किया है, afunction कभी नहीं कहा जाता है। आप कुछ इस तरह कर सकता है:

class A: 
    def __init__(self): 
     self.a = 1 

    def seta(self): 
     def afunction(self): 
      self.a = 4 
     afunction(self) 

    def geta(self): 
     return self.a 

a = A() 
print a.a 
a.seta() 
print a.a 

यहाँ हम वास्तव में afunction फोन और स्पष्ट रूप से इसे पारित self, लेकिन इस विशेषता a स्थापित करने के लिए एक नहीं बल्कि मूर्खतापूर्ण तरीका है - खासकर जब हम इसके लिए आवश्यकता के बिना स्पष्ट रूप से कर सकते हैं टिककर खेल या setters: a.a = 4

या आप समारोह return सकता है:

def seta(self): 
    def afunction(): #Don't need to pass `self`. It gets picked up from the closure 
     self.a = 4 
    return afunction 

और उसके बाद कोड में:

a = A() 
a.seta()() #the first call returns the `afunction`, the second actually calls it. 
-1

के रूप में कई अन्य लोगों ने कहा है, आप वास्तव में कॉल कुछ बिंदु पर कार्यात्मक की जरूरत है।

def seta(self): 
    def functiona(self): #defined 
     self.a = 4 
    functiona()   #called 
+0

यह काम नहीं करना चाहिए। कम से कम पायथन 3 में, आपको एक त्रुटि मिलेगी 'अनुपलब्ध 1 आवश्यक स्थितित्मक तर्क:' self''। आपको 'functiona (self)' को कॉल करने की आवश्यकता होगी, लेकिन फिर भी यह समाधान नेस्टेड फ़ंक्शन को परिभाषित करने के लिए अनावश्यक है। – Yeo

+0

आपने यह नहीं देखा कि यह मूल प्रश्न में कक्षा के दायरे में कुछ परिभाषित कर रहा था। –

0

आप इसे कैसे 4 के लिए समानता कर सकते हैं: टिप्पणियाँ दूँगी नहीं मुझे इस intelligably तो यहाँ लिखें एक जवाब है

class A: 
    def __init__(self): 
     self.a = 1 
     self.b = 2 
     self.c = 3 
    def seta(self): 
     ##def afunction(self): (remove this) 
     self.a = 4 
    def geta(self): 
     return self.a 

ट्रिकी हिस्सा: क्यों करता है 4 के लिए समानता नहीं है ...

वर्तमान में केवल "निष्पादन" के माध्यम से 4 पर सेट है। चूंकि निष्पादन को कभी भी बुलाया नहीं जाता है, यह कभी निष्पादित नहीं होता है .. सेटा में "घुटने" के अंदर घोंसला है लेकिन इसे नहीं कहा जाता है ... वर्गों के भीतर सदस्य चर के समान।

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