পাইথন, অবজেক্ট তৈরি করা


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

দ্রষ্টব্য যে পাইথনের দর্শনের অন্যতম মূলনীতি "সেখানে একটি হওয়া উচিত pre এবং কেবলমাত্র একটিই করা উচিত - এটি করার সুস্পষ্ট উপায়" , এখনও এটি করার একাধিক উপায় রয়েছে। পাইথনের গতিশীল সক্ষমতার সুযোগ নিতে আপনি নিম্নলিখিত দুটি স্নিপেট ব্যবহার করতে পারেন:

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

আমি পূর্বেরটিকে পছন্দ করি তবে এমন উদাহরণ রয়েছে যেখানে উত্তরোত্তর কার্যকর হতে পারে - মঙ্গোডিবি এর মতো নথির ডাটাবেসের সাথে কাজ করার সময় একটি one


17
আপনি আপনার init এর আগে ক্লাস ভেরিয়েবল হিসাবে এগুলি কেন শুরু করছেন? (কৌতূহলী; খুব সহজেই সেই প্যাটার্নটি দেখেনি)
GoingTharn

7
পাঠযোগ্যতার উদ্দেশ্যে। ক্লাস ভেরিয়েবলগুলি ডিআই এর আগে শীর্ষের কাছে রেখে, আমি দ্রুত দেখতে পাচ্ছি যে কোন ভেরিয়েবলগুলি ক্লাস স্কোপে রয়েছে কারণ সেগুলি সম্ভবত কনস্ট্রাক্টরের দ্বারা সেট করা যায় না।
ওল্ফ্রাম

1
এখানে অবজেক্টের নামটি যা ক্লাসের উদাহরণ হিসাবে শিক্ষার্থী ঠিক ছাত্র থেকে যাচ্ছে? আমি যদি ছাত্র01, ছাত্র02, .. ইত্যাদি নামের সাথে প্রতিটি কলে একাধিক অবজেক্ট চাই?
ইয়াথি

9
আপনার উদাহরণের ভেরিয়েবলগুলি কী ভয়ঙ্কর অনুশীলন তা দেখার জন্য শ্রেণি ভেরিয়েবল তৈরি করা। যে কোনও নবীন পাঠককে: পরিবর্তে @ পাইরোস্প্যাডের উত্তরটি দেখুন।
anon01

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__


আমাদের শিক্ষক আমাদের একটি টেস্ট.পি প্রোগ্রাম দিয়েছেন যা পরীক্ষা করে যদি আমরা সমস্যাগুলি সঠিকভাবে করি তবে। প্রশ্নটি আমাকে বিশেষভাবে মেক_স্টুডেন্ট ফাংশনটি ব্যবহার করতে চায়। শেষ লক্ষ্যটি হ'ল: এস 1 = মেক_স্টুডেন্ট (নাম, বয়স, মেজর) এবং এখন আমার কাছে এস 1-এ দেওয়া সমস্ত কিছু রয়েছে। তবে আবার আমি নিশ্চিত নই যে তারা এস 1 কী হতে চায়? আমি এটি একটি অ্যারে 'নাম' দিয়ে করতে পারি: নাম..ইটিসি} তবে এটি আমাকে সঠিক উত্তর দেয় নি তাই আমি ধরে নিচ্ছি যে আমি ক্লাস এবং উদাহরণ থেকে যা শিখেছি তা প্রয়োগ করা দরকার
মহসেন এম। আলারশীদ

1
তথাকথিত "ফ্যাক্টরি পদ্ধতি" প্যাটার্ন, আপনি কোডটিতে সরাসরি তৈরি করার পরিবর্তে কোনও ধরণের অবজেক্ট তৈরির জন্য যেখানে কোনও পদ্ধতি বা ফাংশন ব্যবহার করেন এটি একটি দরকারী প্যাটার্ন, এটি আপনাকে উত্তরাধিকার সম্পর্কে দুর্দান্ত জিনিসগুলি ব্যবহার করার সুযোগ দেয় উদাহরণস্বরূপ । এটি সন্ধান করুন;)
bracco23

28

বিষয়গুলি ক্লাসের উদাহরণ of ক্লাসগুলি কেবলমাত্র বস্তুর ব্লুপ্রিন্ট। আপনার শ্রেণীর সংজ্ঞা দেওয়া হয়েছে -

# 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
আমি আমার আগের মন্তব্য প্রত্যাহার। স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 4015417/ … দেখুন । সুতরাং শ্রেণীর নাম (বস্তু) বানান করার আসলে কারণ রয়েছে:
ওল্ফ্রাম

1
পাইথনে কোনও
নির্মাতা নেই

কিভাবে __init__()কনস্ট্রাক্টর থেকে পদ্ধতি আলাদা?
পাইরোস্প্যাড

1
__init__কোনও নির্মাণকারী নয়, "কারণ অবজেক্টটি ইতিমধ্যে সময় দ্বারা নির্মিত হয়েছে __init__বলে ডাকা হয়, এবং আপনার কাছে ইতিমধ্যে শ্রেণীর নতুন উদাহরণটির জন্য একটি বৈধ রেফারেন্স রয়েছে।" ( diveintopython.net/object_oriented_framework/… )
ব্রায়ান জেড

3

আপনি যখন পূর্বনির্ধারিত শ্রেণি ব্যবহার করে কোনও বস্তু তৈরি করেন, প্রথমে আপনি সেই অবজেক্টটি সংরক্ষণের জন্য একটি ভেরিয়েবল তৈরি করতে চান। তারপরে আপনি তৈরি করেছেন এমন অবজেক্ট এবং স্টোর ভেরিয়েবল তৈরি করতে পারেন।

class Student:
     def __init__(self):

# creating an object....

   student1=Student()

প্রকৃতপক্ষে এই init পদ্ধতিটি শ্রেণীর নির্মাতা y আপনি কিছু বৈশিষ্ট্য ব্যবহার করে সেই পদ্ধতিটি শুরু করতে পারেন .. সেই সময়ে, আপনি যখন কোনও বস্তু তৈরি করবেন তখন আপনাকে নির্দিষ্ট বৈশিষ্ট্যের জন্য কিছু মান পাস করতে হবে ..

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

 # creating an object.......

     student2=Student("smith",25)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.