2013-02-26 14 views
83

मैं अजगर सीखने की कोशिश कर रहा हूं और अब मैं कक्षाओं की लटक पाने और उदाहरणों के साथ उन्हें कैसे छेड़छाड़ करने की कोशिश कर रहा हूं।पायथन, ऑब्जेक्ट्स बनाने

मैं इस अभ्यास समस्या को समझने के लिए प्रतीत नहीं कर सकते हैं:

बनाएँ और एक छात्र वस्तु जिसका नाम, आयु लौटने के लिए, और प्रमुख इनपुट के रूप में दिए जाने वाले सम्मान के रूप में ही

def make_student(name, age, major) 

मैं बस कर रहे हैं ऑब्जेक्ट द्वारा इसका अर्थ क्या नहीं है, क्या उनका मतलब है कि मुझे इन मानों को रखने वाले फ़ंक्शन के अंदर एक सरणी बनाना चाहिए? या एक वर्ग बनाएँ और इस समारोह को इसके अंदर रहने दें, और उदाहरण असाइन करें?

class Student: 
    def __init__(self, name, age, major): 
     self.name = name 
     self.age = age 
     self.major = major 

    def is_old(self): 
     return self.age > 100 

अब, आप कर सकते हैं:

class Student: 
    name = "Unknown name" 
    age = 0 
    major = "Unknown major" 
+0

पढ़ें डाटा मॉडल डॉक्स, विशेष रूप से '__init__' विधि यहाँ प्रासंगिक है: http://docs.python.org/2/reference/datamodel.html#object.__init__ – wim

+0

कोई नहीं (कोट के बिना) है पाइथन – monkut

उत्तर

119
class Student(object): 
    name = "" 
    age = 0 
    major = "" 

    # The class "constructor" - It's actually an initializer 
    def __init__(self, name, age, major): 
     self.name = name 
     self.age = age 
     self.major = major 

def make_student(name, age, major): 
    student = Student(name, age, major) 
    return student 

नोट भले ही अजगर के दर्शन में सिद्धांतों में से एक है कि "एक और अच्छा होगा यदि केवल एक स्पष्ट यह करने के लिए जिस तरह से होना चाहिए", वहां अभी भी यह करने के लिए कई तरीके हैं। तुम भी अजगर की गतिशील क्षमताओं का लाभ उठाने के लिए कोड के दो निम्नलिखित स्निपेट का उपयोग कर सकते हैं:

class Student(object): 
    name = "" 
    age = 0 
    major = "" 

def make_student(name, age, major): 
    student = Student() 
    student.name = name 
    student.age = age 
    student.major = major 
    # Note: I didn't need to create a variable in the class definition before doing this. 
    student.gpa = float(4.0) 
    return student 

मैं पूर्व पसंद करते हैं, लेकिन वहाँ मामलों में जहां उत्तरार्द्ध उपयोगी हो सकते हैं - एक से किया जा रहा है जब MongoDB तरह दस्तावेज़ डेटाबेस के साथ काम ।

+9

आप अपने init से पहले कक्षा चर के रूप में क्यों शुरू कर रहे हैं? (उत्सुक; उस पैटर्न को अक्सर नहीं देखा है) – GoingTharn

+2

पठनीयता उद्देश्यों के लिए। इनिट से पहले शीर्ष के पास कक्षा चर डालने से, मैं जल्दी से देख सकता हूं कि कक्षा के दायरे में कौन से चर हैं क्योंकि वे सभी कन्स्ट्रक्टर द्वारा सेट नहीं किए जा सकते हैं। – Wulfram

+1

यहां ऑब्जेक्ट का नाम जो क्लास स्टूडेंट का उदाहरण है, छात्र सही रहेगा? क्या होगा यदि मैं प्रत्येक छात्र पर छात्र 01, student02, आदि के साथ कई ऑब्जेक्ट्स चाहता हूं? – Yathi

35

एक कक्षा बनाएं और यह एक __init__ विधि देना (इस सवाल से पहले मैं नाम, आयु, और प्रमुख के अंदर के साथ एक छात्र वर्ग की स्थापना करने के लिए कहा गया था) Student वर्ग का एक उदाहरण प्रारंभ:

>>> s = Student('John', 88, None) 
>>> s.name 
    'John' 
>>> s.age 
    88 

हालांकि मुझे यकीन है कि तुम क्यों एक make_student छात्र समारोह की जरूरत है अगर यह एक ही बात करता है नहीं कर रहा हूँ Student.__init__ के रूप में।

+0

में सामान्य * असाइन किए गए * डिफ़ॉल्ट मान हमारे शिक्षक ने हमें एक test.py प्रोग्राम दिया जो परीक्षण करता है कि हमने सही तरीके से समस्याएं की हैं। सवाल यह है कि मैं विशेष रूप से make_student फ़ंक्शन का उपयोग करना चाहता हूं। अंतिम लक्ष्य है: s1 = make_student (नाम, आयु, प्रमुख) और अब मेरे पास सब कुछ एस 1 को सौंपा गया है। लेकिन फिर मुझे यकीन नहीं है कि वे एस 1 क्या चाहते हैं? मैं इसे एक सरणी {'name': name..etc} के साथ कर सकता हूं लेकिन इससे मुझे सही जवाब नहीं मिला है, इसलिए मुझे लगता है कि मुझे कक्षाओं और उदाहरणों से जो कुछ मैंने सीखा है उसे लागू करने की आवश्यकता है –

+0

तथाकथित "फैक्ट्री विधि "पैटर्न, वह एक जहां आप किसी विधि या फ़ंक्शन का उपयोग सीधे कोड में बनाने के बजाय किसी प्रकार का ऑब्जेक्ट बनाने के लिए करते हैं, यह एक उपयोगी पैटर्न है, यह आपको उदाहरण के लिए विरासत के बारे में अच्छी चीजों का फायदा उठाने की अनुमति देता है। इसे देखो;) – bracco23

10

ऑब्जेक्ट्स कक्षाओं के उदाहरण हैं। कक्षाएं वस्तुओं के लिए सिर्फ ब्लूप्रिंट हैं। तो अपने वर्ग परिभाषा दी -

# Note the added (object) - this is the preferred way of creating new classes 
class Student(object): 
    name = "Unknown name" 
    age = 0 
    major = "Unknown major" 

आप स्पष्ट रूप से Student का एक नया उदाहरण के लिए गुण सौंप कर make_student समारोह बना सकते हैं -

def make_student(name, age, major): 
    student = Student() 
    student.name = name 
    student.age = age 
    student.major = major 
    return student 

लेकिन यह शायद और अधिक समझ में आता है एक निर्माता में यह करने के लिए (__init__) -

class Student(object): 
    def __init__(self, name="Unknown name", age=0, major="Unknown major"): 
     self.name = name 
     self.age = age 
     self.major = major 

जब आपका उपयोग निर्माता कहा जाता है। यह __init__ विधि में परिभाषित तर्क लेगा। कन्स्ट्रक्टर हस्ताक्षर अब अनिवार्य रूप से Student(name, age, major) होगा।

आपको लगता है कि का उपयोग करते हैं, तो एक make_student समारोह तुच्छ (और ज़रूरत से ज़्यादा) है -

def make_student(name, age, major): 
    return Student(name, age, major) 

मस्ती के लिए, यहाँ कैसे एक वर्ग को परिभाषित करने के बिना एक make_student समारोह बनाने के लिए का एक उदाहरण है। कृपया घर पर यह कोशिश मत करो।

def make_student(name, age, major): 
    return type('Student', (object,), 
       {'name': name, 'age': age, 'major': major})() 
+0

दरअसल, मैं वर्ग नाम (ऑब्जेक्ट) नहीं करना चाहता हूं: वर्बसिटी कारणों से। पायथन दस्तावेज भी ऐसा नहीं करता है। हालांकि मुझे एक ताना में खिलाने का "खतरनाक" उदाहरण पसंद है। http://docs.python.org/2/tutorial/classes.html – Wulfram

+0

मैंने अपनी पिछली टिप्पणी वापस ले ली। Http://stackoverflow.com/questions/4015417/python-class-inherits-object देखें। तो वास्तव में वर्ग नाम (ऑब्जेक्ट) का जादू करने का एक कारण है: – Wulfram

+1

पायथन में कोई कन्स्ट्रक्टर नहीं है :) – BigSack

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