পাইথনে আমি কখন ক্লাস ব্যবহার করব?


176

আমি প্রায় দুই বছর ধরে পাইথনে প্রোগ্রামিং করছি; বেশিরভাগ ডেটা স্টাফ (পান্ডাস, এমপিএল, নম্পি), তবে অটোমেশন স্ক্রিপ্ট এবং ছোট ওয়েব অ্যাপ্লিকেশনগুলিও থাকে। আমি আরও ভাল প্রোগ্রামার হওয়ার চেষ্টা করছি এবং আমার অজগর জ্ঞান বাড়াতে পারি এবং যে জিনিসগুলি আমাকে বিরক্ত করে তা হ'ল আমি কখনই কোনও ক্লাস ব্যবহার করি নি (ছোট ওয়েব অ্যাপ্লিকেশনের জন্য এলোমেলো ফ্লাসক কোড অনুলিপি করার বাইরে)। আমি সাধারণত সেগুলি কী তা বুঝতে পারি তবে আমার মাথাটি প্রায় কোনও সাধারণ ক্রিয়াকলাপের জন্য কেন তাদের প্রয়োজন হবে তা আমার মনে হয় না seem

আমার প্রশ্নের সুনির্দিষ্টতা যোগ করার জন্য: আমি অনেকগুলি স্বয়ংক্রিয় প্রতিবেদন লিখি যা সর্বদা একাধিক ডেটা উত্স (মঙ্গো, স্কিল, পোস্টগ্রিস, এপিস) থেকে ডেটা টানতে জড়িত থাকে, প্রচুর পরিমাণে বা কিছু ডেটা মংগিং এবং ফরম্যাটিং করে, সিএসভি / এক্সেলে ডেটা লিখে / এইচটিএমএল, এটি একটি ইমেল প্রেরণ। স্ক্রিপ্টগুলি ~ 250 লাইন থেকে ~ 600 লাইনের মধ্যে রয়েছে। এটি করার জন্য আমার ক্লাস ব্যবহার করার কোনও কারণ থাকবে এবং কেন?


15
কোনও ক্লাসবিহীন কোডে কোনও অসুবিধে নেই যদি আপনি নিজের কোড নিকার পরিচালনা করতে পারেন। ওওপি প্রোগ্রামাররা ভাষা নকশা বা বিভিন্ন নিদর্শনগুলির উপর ভিত্তি করে বোঝার কারণে বাধাগুলির কারণে সমস্যাগুলিকে অতিরঞ্জিত করে।
জেসন হু

উত্তর:


133

ক্লাসগুলি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের স্তম্ভ । ওওপি কোড সংগঠন, পুনরায় ব্যবহারযোগ্যতা এবং এনক্যাপসুলেশনের সাথে অত্যন্ত উদ্বিগ্ন।

প্রথমত, একটি অস্বীকৃতি: ওওপি আংশিকভাবে ফাংশনাল প্রোগ্রামিংয়ের বিপরীতে , যা পাইথনে প্রচুর ব্যবহৃত একটি আলাদা দৃষ্টান্ত। পাইথনে প্রোগ্রাম করা প্রত্যেকে (বা অবশ্যই বেশিরভাগ ভাষা) ওওপি ব্যবহার করে না। আপনি জাভা 8 এ অনেক কিছু করতে পারেন যা খুব বেশি অবজেক্ট ওরিয়েন্টেড নয়। আপনি যদি ওওপি ব্যবহার করতে না চান তবে ব্যবহার করবেন না। আপনি যদি ডেটা প্রক্রিয়া করার জন্য কেবল ওয়ান-অফ স্ক্রিপ্টগুলি লিখেন যা আপনি আর কখনও ব্যবহার করবেন না, তবে আপনি যেভাবে লিখছেন তা চালিয়ে যান।

তবে ওওপি ব্যবহারের অনেক কারণ রয়েছে।

কিছু কারণ:

  • সংস্থা: ওওপি কোডে ডেটা এবং পদ্ধতি উভয়কে বর্ণনা ও সংজ্ঞা দেওয়ার সুপরিচিত এবং মানক উপায়গুলি সংজ্ঞায়িত করে। ডেটা এবং পদ্ধতি উভয়ই সংজ্ঞার বিভিন্ন স্তরে (বিভিন্ন শ্রেণিতে) সংরক্ষণ করা যেতে পারে, এবং এই সংজ্ঞাগুলি সম্পর্কে কথা বলার জন্য স্ট্যান্ডার্ড উপায় রয়েছে। এটি হ'ল যদি আপনি ওওপিটিকে একটি স্ট্যান্ডার্ড উপায়ে ব্যবহার করেন তবে এটি আপনার পরবর্তী স্ব এবং অন্যদের আপনার কোড বুঝতে, সম্পাদনা করতে এবং ব্যবহার করতে সহায়তা করবে। এছাড়াও, জটিল, স্বেচ্ছাসেবী ডেটা স্টোরেজ মেকানিজম (ডিকটস বা তালিকার ডিকটস বা ডিক্টস বা সেটগুলির ডাইক্টের তালিকা, বা যাই হোক না কেন) ব্যবহার করার পরিবর্তে, আপনি ডেটা স্ট্রাকচারের টুকরোটির নাম রাখতে পারেন এবং সেগুলি সহজেই উল্লেখ করতে পারেন।

  • রাষ্ট্র: ওওপি আপনাকে সংজ্ঞায়িত করতে এবং রাষ্ট্রের উপর নজর রাখতে সহায়তা করে। উদাহরণস্বরূপ, একটি ক্লাসিক উদাহরণে, আপনি যদি এমন একটি প্রোগ্রাম তৈরি করেন যা শিক্ষার্থীদের প্রক্রিয়া করে (উদাহরণস্বরূপ, গ্রেড প্রোগ্রাম), আপনি তাদের সম্পর্কে আপনার প্রয়োজনীয় সমস্ত তথ্য এক জায়গায় রাখতে পারবেন (নাম, বয়স, লিঙ্গ, গ্রেড স্তর, কোর্স, গ্রেড, শিক্ষক, সমবয়সী, ডায়েট, বিশেষ প্রয়োজন ইত্যাদি) এবং এই তথ্যটি যতক্ষণ অবজেক্ট থাকে ততক্ষণ ধরে রাখা যায় এবং সহজেই অ্যাক্সেসযোগ্য।

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

  • উত্তরাধিকার : উত্তরাধিকার আপনাকে ডেটা এবং পদ্ধতি এক জায়গায় (এক শ্রেণিতে) সংজ্ঞায়িত করতে এবং তারপরে ওভাররাইড বা সেই কার্যকারিতাটি প্রসারিত করতে দেয়। উদাহরণস্বরূপ, পাইথনে, আমি প্রায়শই লোকদের dictঅতিরিক্ত কার্যকারিতা যুক্ত করার জন্য ক্লাসের সাবক্লাস তৈরি করতে দেখি। অজানা কীটির উপর ভিত্তি করে ডিফল্ট মান দেওয়ার জন্য কোনও অভিধান থেকে একটি কী অনুরোধ করা হয় এমন একটি ব্যতিক্রম ছুঁড়ে ফেলা একটি সাধারণ পরিবর্তনটি সেই পদ্ধতিটিকে ওভাররাইড করে। এটি আপনাকে এখন বা পরে আপনার নিজের কোডটি প্রসারিত করতে, অন্যদের আপনার কোড প্রসারিত করার অনুমতি দেয় এবং আপনাকে অন্য ব্যক্তির কোড প্রসারিত করতে দেয়।

  • পুনরায় ব্যবহারযোগ্যতা: এই সমস্ত কারণ এবং অন্যান্য কোডের বৃহত্তর পুনঃব্যবহারযোগ্যতার জন্য অনুমতি দেয়। অবজেক্ট ওরিয়েন্টেড কোড আপনাকে একবার কঠিন (পরীক্ষিত) কোড লিখতে দেয় এবং তারপরে বারবার পুনরায় ব্যবহার করতে দেয়। আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে যদি আপনাকে কিছু টুইট করতে হয় তবে আপনি একটি বিদ্যমান বর্গ থেকে উত্তরাধিকারী হয়ে বিদ্যমান আচরণটি ওভাররাইট করতে পারেন। আপনার যদি কিছু পরিবর্তন করার প্রয়োজন হয় তবে বিদ্যমান জনসাধারণের পদ্ধতি স্বাক্ষরগুলি বজায় রেখে আপনি এগুলি সব পরিবর্তন করতে পারেন এবং কেউ জ্ঞানী (আশাবাদী) নয়।

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

শিক্ষার্থী ব্যবহারের ক্ষেত্রে একটি উদাহরণ (কোড মানের কোনও গ্যারান্টি নেই, কেবল একটি উদাহরণ):

অবজেক্ট ওরিয়েন্টেড

class Student(object):
    def __init__(self, name, age, gender, level, grades=None):
        self.name = name
        self.age = age
        self.gender = gender
        self.level = level
        self.grades = grades or {}

    def setGrade(self, course, grade):
        self.grades[course] = grade

    def getGrade(self, course):
        return self.grades[course]

    def getGPA(self):
        return sum(self.grades.values())/len(self.grades)

# Define some students
john = Student("John", 12, "male", 6, {"math":3.3})
jane = Student("Jane", 12, "female", 6, {"math":3.5})

# Now we can get to the grades easily
print(john.getGPA())
print(jane.getGPA())

স্ট্যান্ডার্ড ডিক্ট

def calculateGPA(gradeDict):
    return sum(gradeDict.values())/len(gradeDict)

students = {}
# We can set the keys to variables so we might minimize typos
name, age, gender, level, grades = "name", "age", "gender", "level", "grades"
john, jane = "john", "jane"
math = "math"
students[john] = {}
students[john][age] = 12
students[john][gender] = "male"
students[john][level] = 6
students[john][grades] = {math:3.3}

students[jane] = {}
students[jane][age] = 12
students[jane][gender] = "female"
students[jane][level] = 6
students[jane][grades] = {math:3.5}

# At this point, we need to remember who the students are and where the grades are stored. Not a huge deal, but avoided by OOP.
print(calculateGPA(students[john][grades]))
print(calculateGPA(students[jane][grades]))

"ফলন" এর কারণে পাইথন এনক্যাপসুলেশন ক্লাসের তুলনায় প্রায়শই জেনারেটর এবং প্রসঙ্গ পরিচালকদের সাথে পরিষ্কার থাকে।
দিমিত্রি রুবানোভিচ

4
@ মিটার আমি একটি উদাহরণ যুক্ত করেছি। আমি আসা করি এটা সাহায্য করবে. এখানে নোটটি হ'ল সঠিক নামযুক্ত আপনার ডিক্টের কীগুলির উপর নির্ভর করার পরিবর্তে, পাইথন ইন্টারপ্রেটার আপনার জন্য এই সীমাবদ্ধতা তৈরি করে যদি আপনি বিড়বিড় হয়ে যান এবং আপনাকে সংজ্ঞায়িত পদ্ধতিগুলি ব্যবহার করতে বাধ্য করেন (যদিও সংজ্ঞায়িত ক্ষেত্রগুলি নেই (যদিও জাভা এবং অন্যান্য ওওপি ভাষা আপনাকে পাইথনের মতো শ্রেণির বাইরে ক্ষেত্রগুলি সংজ্ঞায়িত করতে দেয় না))।
ড্যান্টিস্টন

5
@ মিটারটিও, এনক্যাপসুলেশনের উদাহরণ হিসাবে: আসুন আজ বলি যে এই বাস্তবায়নটি ঠিক আছে কারণ আমার বিশ্ববিদ্যালয়ে 50,000 শিক্ষার্থীর জন্য শুধুমাত্র একবারের জন্য জিপিএ নেওয়া দরকার। এখন আগামীকাল আমরা একটি অনুদান পেয়েছি এবং প্রতিটি শিক্ষার্থীর বর্তমান জিপিএ প্রতি সেকেন্ডে দেওয়া দরকার (অবশ্যই, কেউ এ জন্য জিজ্ঞাসা করবে না, কেবল এটি গণনামূলকভাবে চ্যালেঞ্জিং করার জন্য)। তারপরে আমরা জিপিএটিকে "মেমোয়েজ" করতে পারি এবং এটি পরিবর্তিত হলেই এটি গণনা করতে পারি (উদাহরণস্বরূপ, সেটগ্রাড পদ্ধতিতে ভেরিয়েবল সেট করে), অন্য একটি ক্যাশেড সংস্করণ ফেরত দেয়। ব্যবহারকারী এখনও getGPA () ব্যবহার করে তবে প্রয়োগটি বদলে গেছে।
ড্যান্টিস্টন

4
@ ড্যান্টিস্টন, এই উদাহরণটির সংগ্রহ প্রয়োজন named নাম্টুপাল needs আপনি নতুন ধরণের স্টুডেন্ট = কালেকশন.নেমটুপল ("ছাত্র", "নাম, বয়স, লিঙ্গ, স্তর, গ্রেড") তৈরি করতে পারেন। এবং তারপরে আপনি উদাহরণস্বরূপ জন = শিক্ষার্থী ("জন", 12, "পুরুষ", গ্রেড = {'গণিত': 3.5}, স্তর = 6) তৈরি করতে পারেন। লক্ষ্য করুন যে আপনি কোনও শ্রেণি তৈরির সাথে যেমনভাবে অবস্থানগত এবং নামযুক্ত উভয় যুক্তিই ব্যবহার করেন। এটি একটি ডেটা টাইপ যা ইতিমধ্যে পাইথনে আপনার জন্য প্রয়োগ করা হয়েছে। এরপরে টিপলের 1 ম উপাদানটি পেতে আপনি জন [0] বা জন.নাম দেখতে পারেন। আপনি এখন জন.grades.values ​​() হিসাবে জন এর গ্রেড পেতে পারেন। এবং এটি ইতিমধ্যে আপনার জন্য সম্পন্ন হয়েছে।
দিমিত্রি রুবানভিচ

2
আমার জন্য এনক্যাপসুলেশন হ'ল সর্বদা ওওপি ব্যবহার করার উপযুক্ত কারণ। আমি মান দেখতে লড়াই করছি যে কোনও যুক্তিসঙ্গত আকারের কোডিং প্রকল্পের জন্য ওওপি ব্যবহার করা হচ্ছে না। আমি অনুমান করি আমার বিপরীত প্রশ্নের উত্তর দরকার :)
সান জে

23

যখনই আপনার নিজের ফাংশনগুলির একটি স্থিতি বজায় রাখা দরকার এবং এটি জেনারেটর দ্বারা সম্পাদন করা যায় না (ফাংশন যা প্রত্যাবর্তনের চেয়ে ফল দেয়) জেনারেটররা তাদের নিজস্ব রাষ্ট্র বজায় রাখে।

আপনি যদি কোনও মানক অপারেটরকে ওভাররাইড করতে চান তবে আপনার একটি ক্লাস দরকার।

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

আপনি যদি "পাইথোনিক" কোডটি লিখতে চান তবে আপনার ক্লাসের চেয়ে প্রসঙ্গ পরিচালক এবং জেনারেটর পছন্দ করা উচিত। এটা পরিষ্কার হবে।

আপনি যদি কার্যকারিতা প্রসারিত করতে চান তবে আপনি উত্তরাধিকারের চেয়ে প্রায় সর্বদা পাত্রে এটি সম্পন্ন করতে সক্ষম হবেন।

প্রতিটি নিয়ম হিসাবে, এটি একটি ব্যতিক্রম আছে। আপনি যদি দ্রুত কার্যকারিতা encapsulate করতে চান (যেমন, গ্রন্থাগার-স্তর পুনরায় ব্যবহারযোগ্য কোডের পরিবর্তে পরীক্ষার কোডটি লিখুন), আপনি একটি শ্রেণিতে রাষ্ট্রকে encapsulate করতে পারেন। এটি সহজ হবে এবং পুনরায় ব্যবহারযোগ্য হবে না।

আপনার যদি সি ++ স্টাইলের ডেস্ট্রাক্টর (আরআইআইএ) প্রয়োজন হয় তবে আপনি অবশ্যই ক্লাস ব্যবহার করতে চান না। আপনি প্রসঙ্গ পরিচালকদের চান।


1
@ দিমিত্রি রুবানোভিচ বন্ধগুলি পাইথনে জেনারেটরের মাধ্যমে প্রয়োগ করা হয় না।
এলি করভিগো

1
@ দিমিত্রি রুবানোভিচ আমি উল্লেখ করছিলাম "পাইথনের জেনারেটর হিসাবে ক্লোজারগুলি প্রয়োগ করা হয়", যা সত্য নয়। বন্ধগুলি অনেক বেশি নমনীয়। জেনারেটর একটি Generatorউদাহরণ (একটি বিশেষ পুনরাবৃত্তকারী) ফেরত দিতে বাধ্য , যখন ক্লোজারগুলিতে কোনও স্বাক্ষর থাকতে পারে। ক্লোজার তৈরি করে আপনি মূলত বেশিরভাগ সময় ক্লাস এড়াতে পারেন। এবং ক্লোজারগুলি কেবল "অন্যান্য ফাংশনগুলির প্রসঙ্গে নির্ধারিত ফাংশন" নয়।
এলি করভিগো

3
@ এলি করভিগো, আসলে, জেনারেটর সিন্টেক্সিকভাবে একটি গুরুত্বপূর্ণ লিপ। তারা একইভাবে একটি কাতারের বিমূর্ততা তৈরি করে যে ফাংশনগুলি স্ট্যাকের বিমূর্ততা। এবং বেশিরভাগ ডেটা প্রবাহ স্ট্যাক / সারি আদিম থেকে একসাথে পাইস করা যায়।
দিমিত্রি রুবানোভিচ

1
@ দিমিত্রি রুবানোভিচ আমরা এখানে আপেল এবং কমলা বলছি। আমি বলছি, যে জেনারেটরগুলি খুব সীমিত সংখ্যক ক্ষেত্রে কার্যকর এবং কোনওভাবেই সাধারণ উদ্দেশ্যে রাষ্ট্রীয় কলযোগ্যদের বিকল্প হিসাবে বিবেচিত হতে পারে না। আপনি আমাকে বলছেন, তারা আমার বক্তব্যের বিরোধী না করে কত মহান।
এলি করভিগো

1
@ ইলি করভিগো, এবং আমি বলছি যে কলযোগ্যগুলি কেবল ফাংশনগুলির সাধারণীকরণ। যা তারা নিজেরাই স্ট্যাকের প্রক্রিয়াজাতকরণের জন্য সিনট্যাকটিক চিনি। জেনারেটর সারি প্রক্রিয়াকরণ ওভার সিনট্যাকটিক চিনি হয়। তবে এটি সিনট্যাক্সের এই উন্নতি যা আরও জটিল নির্মানকে সহজে এবং আরও সুস্পষ্ট বাক্য গঠন সহ তৈরি করতে দেয়। '.next ()' প্রায় কখনও ব্যবহৃত হয় না, বিটিডব্লিউ।
দিমিত্রি রুবানোভিচ

11

আমি মনে করি আপনি এটি সঠিকভাবে করেন। ক্লাসগুলি যুক্তিসঙ্গত হয় যখন আপনাকে কিছু ব্যবসায়িক যুক্তি বা কঠিন সম্পর্কের সাথে কঠিন বাস্তব জীবনের প্রক্রিয়াগুলি অনুকরণ করতে হয় sim উদাহরণ স্বরূপ:

  • শেয়ার স্টেট সহ বেশ কয়েকটি ফাংশন
  • একই রাষ্ট্র ভেরিয়েবলের একাধিক অনুলিপি
  • একটি বিদ্যমান কার্যকারিতা আচরণ প্রসারিত

আমি আপনাকে এই ক্লাসিক ভিডিওটি দেখার পরামর্শ দিই


3
পাইথনে যখন কলব্যাক ফাংশনটির একটি অবিরাম অবস্থা প্রয়োজন হয় তখন কোনও ক্লাস ব্যবহার করার দরকার নেই। রিটার্নের পরিবর্তে পাইথনের ফলন ব্যবহার করা একটি ফাংশনকে পুনরায় প্রবেশ করে।
দিমিত্রি রুবানোভিচ

4

একটি শ্রেণি একটি বাস্তব বিশ্বের সত্তা সংজ্ঞায়িত করে। আপনি যদি এমন কিছু নিয়ে কাজ করছেন যা স্বতন্ত্রভাবে বিদ্যমান এবং এর নিজস্ব যুক্তি রয়েছে যা অন্যদের থেকে পৃথক, আপনার জন্য এটি একটি শ্রেণি তৈরি করা উচিত। উদাহরণস্বরূপ, একটি শ্রেণি যা ডাটাবেস সংযোগকে encapsulates।

যদি এটি না হয় তবে ক্লাস তৈরি করার দরকার নেই


0

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

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