2011-01-27 14 views
5

में अतिरेक से बचें और अतिरेक के विषय में दो छोटे मुद्दों है:मैं हाल ही में उबंटू सर्वर व्यवस्थापक के लिए अजगर 2.6 का उपयोग शुरू किया अजगर

पहली बात आयात कर रहे हैं: वे सभी वर्ग

से की तरह

आयात कक्षा कुछ इस प्रकार दिखाई

:
from class import Class 

और दूसरी बात __init__ तरीके हैं 10

क्या इन डुप्लिकेशन्स से बचने के तरीके हैं?

उत्तर

7

दूसरी बात अनावश्यक नहीं है - यह इंस्टेंस विशेषताएँ सेट कर रही है। आप इस तरह भी यह कर सकते हैं:

class Foo: 

    def __init__(self, **kwargs): 
     for name, value in kwargs.items(): 
      setattr(self, name, value) 

लेकिन फिर आप इस तरह फू कॉल करने की आवश्यकता:

Foo(arg1=1, arg2=2, arg3=3) 

इसके अलावा अपने आयात अनुचित वाक्य रचना है लगता है। यह from Class import Class होना चाहिए। यह आपके लिए अनावश्यक दिखता है, क्योंकि ऐसा लगता है कि आप प्रत्येक वर्ग को एक अलग फ़ाइल (मॉड्यूल) में संग्रहीत कर रहे हैं - और यह बिल्कुल अनावश्यक है। पायथन जावा नहीं है, आपको आमतौर पर एक मॉड्यूल में अधिक ऑब्जेक्ट्स रखना चाहिए। ध्यान रखें, वह मॉड्यूल स्वयं एक वस्तु है। इसके अलावा आपको मॉड्यूल को सही तरीके से नामित करना चाहिए - डिफ़ॉल्ट कोड शैली मार्गदर्शिका कहती है कि मॉड्यूल सभी विशेष वर्णों के साथ सभी लोअरकेस होना चाहिए। उदाहरण के लिए re या urllib की तरह। आर्ग के लिए

+0

धन्यवाद पहले से ही! मैंने अपना आयात सही किया और अब से मॉड्यूल लोअरकेस रखेंगे। बड़े मॉड्यूल को प्रभावी ढंग से प्रबंधित किए बिना उन्हें कैसे नियंत्रित/संपादित किया जाएगा? – Jasper

+0

बड़े मॉड्यूल से आपका क्या मतलब है? कोड की 3k लाइनें एक बड़ा मॉड्यूल है? इस तरह के एक मॉड्यूल में कई कक्षाएं हो सकती हैं। आप 'Java' /' C++ 'की तुलना में अजगर में बहुत अधिक कोड कर सकते हैं, इसलिए मॉड्यूल पर एकाधिक कक्षाओं को रखने का मतलब यह नहीं है कि यह बड़ा है। – gruszczy

1

संस्करण:

class Foo: 

    def __init__(self, *args): 
     for index,arg in enumerate(args): 
      setattr(self, 'arg%s'%index, arg) 


Foo(1,2,3) 
>>> Foo.arg0 
1 
+2

यह बदसूरत है ... – aaronasterling

+0

मैं मानता हूं, यह पाइथोनिक बिल्कुल नहीं है। स्पष्ट रूप से स्पष्ट है, और यह मुझे अंतर्निहित जादू के हल्के मामले की तरह दिखता है। –

+1

* उम्मीद है कि * वास्तविक विशेषता नाम argN के माध्यम से arg0 नहीं कर रहे हैं, क्योंकि अगर वे कर रहे हैं, वे एक दृश्य होना चाहिए। यदि वे नहीं हैं, तो यह उत्तर लागू नहीं होता है। –

2
from module import Class 

यह वर्ग नाम उनके युक्त मॉड्यूल के नाम से अलग होने के लिए आम बात है। यदि आपके पास एक समान नाम के साथ प्रति मॉड्यूल केवल एक वर्ग है, तो उस श्रेणी को अपने पदानुक्रम में एक स्तर को ऊपर ले जाने पर विचार करें।

def __init__(self, a, b, c): 
    self.a = a 
    self.b = b 
    self.c = c 

इस बार थोड़े परेशान होने लगते हैं, लेकिन यह विकल्पों की तुलना में वास्तव में बुरा नहीं, पठनीयता के लिहाज से है,। हालांकि, यदि आपके पास बहुत सारे पैरामीटर हैं जो आप केवल अपने init में किसी अन्य काम के साथ विशेषताओं के रूप में असाइन करते हैं, तो नामांकित या समान से विरासत पर विचार करें, जो आपके लिए ऐसे बॉयलरप्लेट उत्पन्न कर सकता है। (विशेष रूप से Namedtuple में अन्य ramifications है और केवल कभी-कभी उपयुक्त होगा। मैं इसे बेस क्लास के उदाहरण के रूप में उपयोग कर रहा हूं जो इस प्रकार के बॉयलरप्लेट को संभाल सकता है।)

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