अजगर, वस्तुओं का निर्माण


132

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

मैं इस अभ्यास समस्या को समझ नहीं पा रहा हूँ:

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

def make_student(name, age, major)

मुझे अभी यह नहीं मिला है कि इसका क्या मतलब है? या एक वर्ग बनाएं और इस फ़ंक्शन को उसके अंदर होने दें, और उदाहरण दें? (इस प्रश्न से पहले मुझे एक छात्र वर्ग को नाम, आयु, और अंदर प्रमुख के साथ सेट करने के लिए कहा गया था)

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

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

1
कोई नहीं (कोट के बिना) आम है असाइन नहीं किए गए अजगर में डिफ़ॉल्ट मान
monkut

जवाबों:


173
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।


17
आप उन्हें अपने init से पहले वर्ग चर के रूप में क्यों प्रारंभ कर रहे हैं? (जिज्ञासु; उस पैटर्न को बहुत बार नहीं देखा है)
गोइंगथर्न

7
पठनीय उद्देश्यों के लिए। Init से पहले शीर्ष के पास वर्ग चर डालकर, मैं जल्दी से देख सकता हूं कि कौन से चर वर्ग दायरे में हैं क्योंकि वे सभी कंस्ट्रक्टर द्वारा निर्धारित नहीं किए जा सकते हैं।
वुल्फराम

1
यहाँ उस वस्तु का नाम है, जो कक्षा के छात्र का उदाहरण है, वह छात्र का अधिकार बना रहेगा? क्या होगा यदि मुझे student01, student02, .. और इसी नाम से प्रत्येक कॉल पर कई ऑब्जेक्ट चाहिए?
यति

9
यह देखने के लिए कक्षा चर बनाना कि आपके उदाहरण चर क्या भयानक अभ्यास है। किसी भी नौसिखिए पाठकों के लिए: इसके बजाय @ pyrospade के उत्तर को देखें।
अनोन 01

2
आपका उदाहरण भ्रामक है। कृपया कक्षा के चर नाम का उपयोग करें जो वास्तव में प्रत्येक छात्र की संपत्ति का दुरुपयोग करने के बजाय सभी छात्रों की संपत्ति हैं। उदाहरण के लिए: का उपयोग करें class Unicornऔर के has_hooves = Trueबजाय name = ""
टिम कुइपर्स

49

एक क्लास बनाएं और उसे एक __init__विधि दें:

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

अब, आप Studentवर्ग का एक उदाहरण इनिशियलाइज़ कर सकते हैं :

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

हालांकि मुझे यकीन नहीं है कि आपको एक make_studentछात्र फ़ंक्शन की आवश्यकता है अगर यह उसी तरह काम करता है Student.__init__


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

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

28

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

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

आप make_studentस्पष्ट रूप से नए उदाहरण के लिए विशेषताओं को निर्दिष्ट करके एक फ़ंक्शन बना सकते हैं 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

जब आप उपयोग करते हैं तो कंस्ट्रक्टर को कहा जाता है Student()। यह __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})()

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

1
मैं अपनी पिछली टिप्पणी वापस लेता हूं। Stackoverflow.com/questions/4015417/… देखें । इसलिए वास्तव में क्लास के नाम (ऑब्जेक्ट) को बाहर करने का एक कारण है:
वुल्फराम

1
अजगर में कोई कंस्ट्रक्टर नहीं है :)
बिगस्क

कैसे __init__()विधि एक निर्माता से अलग है?
पीरोसैपेड

1
__init__एक रचनाकार नहीं है, "क्योंकि वस्तु का निर्माण पहले ही हो चुका है, इसलिए उसे __init__कॉल किया जाता है, और आपके पास पहले से ही क्लास के नए उदाहरण के लिए एक वैध संदर्भ है।" ( diveintopython.net/object_oriented_framework/… )
ब्रायन जेड

3

जब आप पूर्वनिर्धारित वर्ग का उपयोग करके एक ऑब्जेक्ट बनाते हैं, तो सबसे पहले आप उस ऑब्जेक्ट को संग्रहीत करने के लिए एक चर बनाना चाहते हैं। फिर आप ऑब्जेक्ट बना सकते हैं और आपके द्वारा बनाए गए वेरिएबल को स्टोर कर सकते हैं।

class Student:
     def __init__(self):

# creating an object....

   student1=Student()

वास्तव में यह init मेथड class.you का कंस्ट्रक्टर है। आप कुछ विशेषताओं का उपयोग करके उस तरीके को इनिशियलाइज़ कर सकते हैं। उस बिंदु पर, जब आप कोई ऑब्जेक्ट बनाते हैं, तो आपको विशेष विशेषताओं के लिए कुछ मान पास करने होंगे।

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

 # creating an object.......

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