2013-06-09 3 views
11

में आयात करता है यदि मैं स्थानीय नामस्थान विधि के लिए क्लास गुणों को असाइन करने का आसान तरीका है तो मैं थोड़ी देर के लिए सोच रहा हूं। उदाहरण के लिए, dosomething विधि में, मैं स्पष्ट रूप से संदर्भ self.a और self.b को बनाने:पाइथन आयात करने वाले क्लास गुणों को स्थानीय नेमस्पेस

class test: 
    def __init__(self): 
     self.a = 10 
     self.b = 20 

    def dosomething(self): 
     a = self.a 
     b = self.b 
     return(a + b) 

लेकिन कभी कभी मैं चर (10 से अधिक) का एक बहुत है और यह भी लिखते हैं और को देखने के लिए गंदा हो जाता है - मैं गुच्छा होता है एक विधि की शुरुआत में var = self.var बयान के।

क्या यह और अधिक कॉम्पैक्ट तरीका करने का कोई तरीका है? (मैं अद्यतन करने जानते local() एक अच्छा विचार नहीं है)

संपादित करें: आदर्श रूप में, मैं क्या चाहते हैं:

def dosomething(self): 
    populate_local_namespace('a', 'b') 
    return(a + b) 
+0

आप इसे पहले स्थान पर क्यों करने की कोशिश कर रहे हैं?एक 'लाइन' dosomething' विधि होने में क्या गलत है जो "वापसी (self.a + self.b)' "जैसा दिखता है? आप इससे क्या लाभ प्राप्त करने की उम्मीद करते हैं? – rmunn

+3

मेरे पास मेरे कारण हैं - विशेष रूप से, मैं जटिल गणना कर रहा हूं और कई 'स्वयं' के भाव बहुत लंबे और बदसूरत बनाते हैं। – joon

उत्तर

21

प्र इस अधिक कॉम्पैक्ट तरह से करने के लिए कोई रास्ता नहीं है (हालांकि मैं समझने के लिए तुम क्यों वर्ग विधि स्थानीय नाम स्थान के लिए जिम्मेदार बताते हैं नकल करने की जरूरत में असमर्थ हूँ)?

1. चर केवल पढ़ने के लिए कर रहे हैं, यह काफी pythonic कारक आउट करने के लिए एक बहु चर एक्सेसर तरीका होगा:

class Test: 

    def __init__(self): 
     self.a = 10 
     self.b = 20 
     self.c = 30 

    def _read_vars(self): 
     return self.a, self.b, self.c 

    def dosomething(self): 
     a, b, c = self._read_vars() 
     return a + b * c 

    def dosomethingelse(self): 
     a, b, c = self._read_vars() 
     return a - b * c 

तो चर केवल पढ़ने के लिए नहीं कर रहे हैं , self.inst_var = value के साथ रहना सर्वोत्तम है। पाइथन कोड लिखना सामान्य तरीका है और आम तौर पर अधिकांश लोग अपेक्षा करते हैं।


2. कभी-कभार आप लोगों को संक्षिप्त एक छोटी चर नाम के साथ self देखेंगे। उन्हें स्टोर करने के लिए है एक बहुत बड़ी संख्या उदाहरण चर को संभालने के लिए

def updatesomethings(s): 
    s.a, s.b, s.c = s.a + s.c, s.b - s.a, s.c * s.b 

3. एक और तरीका है: यह प्रयोग किया जाता है जब decluttering की पठनीयता लाभ को दबा एक गैर मानक चर नाम का उपयोग कर की पठनीयता लागत

class Test: 

    def __init__(self, a, b, c, d, e, f, g, h, i): 
     self._vars = [a, b, c, d, e, f, g, h, i] 

    def fancy_stuff(self): 
     a, b, c, d, e, f, g, h, i = self._vars 
     a += d * h - g 
     b -= e * f - c 
     g = a + b - i 
     self._vars[:] = a, b, c, d, e, f, g, h, i 

4. वहाँ मैं: पैकिंग में आसानी और खोल के लिए एक परिवर्तनशील कंटेनर में यह भी है एक शब्दकोश में गड़बड़ी दृष्टिकोण है कि काम करेगा, लेकिन यह एक कोड गंध है कि ज्यादातर Pythonistas से बच जाएंगे दिया गया है:

def updatesomethings(self): 
    a = 100 
    b = 200 
    c = 300 
    vars(self).update(locals()) 
    del self.self 
+0

धन्यवाद। असल में यह वही है जो मैं कर रहा हूं। लेकिन यह काफी लचीला नहीं है, क्योंकि जब मैं चर बदलना चाहता हूं तो मुझे दोनों जगहों को बदलना होगा। यह बहुत अच्छा होगा अगर कोई तरीका है जहां मैं एक स्ट्रिंग के रूप में किसी फ़ंक्शन में विशेषता का नाम पास कर सकता हूं और विशेषता स्थानीय चर बन जाती है। – joon

+0

@ जून मैंने आपके लिए कुछ अन्य विकल्प भी जोड़े हैं। –

+0

हां 4 डरावना दिखता है :) मैं अभी कॉलिंग फ़ंक्शन विधि ('_read_vars()') का उपयोग करता हूं। आपकी सहायता के लिए धन्यवाद!! – joon

-2

आप आसानी से एक समंजन के साथ इस समस्या को हल कर सकते हैं एक शब्दकोश में चर भंडारण के द्वारा।

data = {} 
copy_to_local_variables = ["a", "b", "c", "d"] 
for var_name in copy_to_local_variables: 
    data[var_name] = getattr(self, var_name) 

+1

क्या यह क्लास गुणों के संदर्भ में स्थानीय चर बनाने के बजाय उन चर के साथ 'डेटा' नामक एक निर्देश नहीं बनायेगा? मुझे नहीं लगता कि यह वही है जो मैं चाहता हूं। – joon

-2

मैं एक रास्ता मिल गया: अगर यह खतरनाक है

def dosomething(self): 
    for key in ['a', 'b']: 
     exec('{} = self.{}'.format(key, key)) 

    return(a + b) 

मैं नहीं जानता या नहीं। अगर कोई इस पर टिप्पणी कर सकता है तो अच्छा होगा।

+3

यह खतरनाक होगा यदि कुंजी कभी भी एक स्ट्रिंग होगी जो अविश्वसनीय स्रोत से आई थी। – korylprince

+2

यह भी बहुत धीमी होने की संभावना है, क्योंकि हर बार जब exec() कॉल किया जाता है, तो पाइथन को नए-नए कथन को लेक्स, पार्स, संकलित और निष्पादित करना होता है, हालांकि इसे पहली बार देखा जाता है। –

+0

टिप्पणियों के लिए धन्यवाद! – joon

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