সুচিপত্র[লুকান][দেখান]
এই লেকচারে, আমরা পাইথনের ক্লাস, কনস্ট্রাক্টর এবং উত্তরাধিকার সম্পর্কে শিখব।
এই ধারণাগুলি একটি বড় প্রোগ্রামে সত্যিই গুরুত্বপূর্ণ যেখানে বিভিন্ন ধরণের সংজ্ঞায়িত করা প্রয়োজন।
ক্লাস
প্রোগ্রামিংয়ে ক্লাস অপরিহার্য এবং সেগুলি পাইথনের জন্য নির্দিষ্ট নয়। আরও অনেকে প্রোগ্রামিং ভাষা ক্লাসের ধারণা সমর্থন করে। আমরা নতুন ডেটা টাইপ সংজ্ঞায়িত করতে ক্লাস ব্যবহার করি।
এ পর্যন্ত, আমরা পাইথনের মৌলিক ডেটা প্রকার যেমন সংখ্যা, স্ট্রিং এবং বুলিয়ান সম্পর্কে শিখেছি। এগুলি পাইথনের মৌলিক বা সাধারণ ডেটা প্রকার। আমরা তালিকা এবং অভিধানের মতো কয়েকটি জটিল ডেটা টাইপও দেখেছি।
যদিও এই ধরনের অত্যন্ত দরকারী, তারা সবসময় জটিল ধারণা মডেল ব্যবহার করা যাবে না. উদাহরণস্বরূপ, একটি পয়েন্ট, বা একটি শপিং কার্টের ধারণা সম্পর্কে চিন্তা করুন। একটি শপিং কার্ট একটি বুলিয়ান বা একটি তালিকা নয়। এটি একটি ভিন্ন ধরনের ডেটা। তাই আমরা বাস্তব ধারণা মডেল করার জন্য নতুন ধরনের সংজ্ঞায়িত করার জন্য ক্লাস ব্যবহার করতে পারি।
এখন, পয়েন্ট নামক একটি নতুন ডেটা টাইপ সংজ্ঞায়িত করা যাক। আমরা আগে চেক হিসাবে এই নতুন ধরনের পদ্ধতি আছে যাচ্ছে.
এইভাবে আপনি এটি করবেন:
আমরা "ক্লাস" কীওয়ার্ড ব্যবহার করে একটি ক্লাস সংজ্ঞায়িত করে শুরু করি এবং তার পরেই আমরা আমাদের ক্লাসের একটি নাম দিই।
class Point
এখন, আমি এখানে যে নামকরণ পদ্ধতি ব্যবহার করেছি তা দেখুন। আমি এখানে প্রথম অক্ষরটি বড় করে লিখেছি, এটিকে আমরা একটি প্যাসকেল নামকরণ কনভেনশন বলি। এই কনভেনশনটি আমাদের ভেরিয়েবল এবং ফাংশনগুলির নামকরণের জন্য যেটি ব্যবহার করি তার থেকে আলাদা যার জন্য আমরা সর্বদা ছোট হাতের অক্ষর ব্যবহার করি এবং একটি আন্ডারস্কোর ব্যবহার করে একাধিক শব্দ আলাদা করি। কিন্তু ক্লাসের নামকরণের সময়, আমরা পরিবর্তে একাধিক শব্দ আলাদা করার জন্য একটি আন্ডারস্কোর ব্যবহার করি না, আমরা প্রতিটি শব্দের প্রথম অক্ষরকে বড় করে লিখি।
আমাদের ক্লাস সংজ্ঞায়িত করার পরে, একটি কোলন ব্যবহার করা হয় যার অর্থ এখন একটি ব্লক সংজ্ঞায়িত করা হয়েছে।
class Point:
def move (self):
এই ব্লকে, আমরা পয়েন্টগুলির সাথে সম্পর্কিত সমস্ত ফাংশন বা পদ্ধতি সংজ্ঞায়িত করতে পারি। উদাহরণস্বরূপ, আমরা একটি বিন্দু সরানোর জন্য "মুভ" নামক একটি ফাংশন সংজ্ঞায়িত করতে পারি। মনে রাখবেন যে আমরা খোলা বন্ধনী টাইপ করার সাথে সাথে PyCharm স্বয়ংক্রিয়ভাবে এখানে "self" যোগ করে। এটি একটি বিশেষ কীওয়ার্ড এবং আমাকে শীঘ্রই এটিতে ফিরে যেতে দিন। টার্মিনালে "move" প্রিন্ট করা যাক।
print("move")
আসুন "ড্র" এর মত আরেকটি পদ্ধতি সংজ্ঞায়িত করি এবং এটি টার্মিনালে প্রিন্ট করি।
def draw(self):
print("draw")
আমরা আমাদের "পয়েন্ট" ক্লাসের সংজ্ঞা দিয়ে শেষ করেছি। এই নতুন ধরনের দিয়ে, আমরা নতুন বস্তু তৈরি করতে পারি। একটি শ্রেণী কেবল সেই ব্লুপ্রিন্টের উপর ভিত্তি করে বস্তু তৈরির জন্য ব্লুপ্রিন্ট বা টেমপ্লেটকে সংজ্ঞায়িত করে যা প্রকৃত উদাহরণ। একটি অবজেক্ট তৈরি করতে, আমরা আমাদের ক্লাসের নাম টাইপ করি এবং তারপর এটিকে একটি ফাংশনের মতো কল করি। এটি একটি নতুন বস্তু তৈরি করে এবং তারপর এটি ফেরত দেয়। তারপরে আমরা সেই বস্তুটিকে একটি চলকের মধ্যে সংরক্ষণ করতে পারি। আমাকে দেখাতে দিন:
এখানে আমরা একটি "পয়েন্ট1" সংজ্ঞায়িত করেছি যা একটি ত্রিমাত্রিক বিন্দু। আপনি দেখতে পাচ্ছেন যে, আমরা টার্মিনালে পৃথক স্থানাঙ্ক মুদ্রণ করতে পারি।
আমরা এই পয়েন্টের সাথে "ড্র" এবং "মুভ" দুটি পদ্ধতি ব্যবহার করতে পারি।
তাই সংক্ষেপে, আমরা নতুন ধরনের সংজ্ঞায়িত করার জন্য ক্লাস ব্যবহার করি এবং এই ধরনের পদ্ধতিগুলি থাকতে পারে যা আমরা ক্লাসের শরীরে সংজ্ঞায়িত করি। ক্লাসে এমন বৈশিষ্ট্য থাকতে পারে যা আমরা আমাদের প্রোগ্রামের যেকোনো জায়গায় সেট করতে পারি।
নির্মাতারা
এখন পর্যন্ত, আমরা শিখেছি কিভাবে ক্লাস ব্যবহার করে নতুন ধরনের তৈরি করতে হয়। এখন এই বাস্তবায়নের সাথে একটি ছোট সমস্যা আছে। আমরা ক্লাস ব্যবহার করে x বা y স্থানাঙ্ক ছাড়াই একটি পয়েন্ট অবজেক্ট তৈরি করতে পারি এবং এটি আদর্শ নয়। আমাকে দেখান.
আসুন একটি বিন্দু তৈরি করি এবং x স্থানাঙ্ক সেট করার আগে এটি প্রিন্ট করি। আমাদের প্রোগ্রাম চালানোর ফলে এইরকম একটি বৈশিষ্ট্য ত্রুটি দেখা দেয়:
এর মানে হল যে পয়েন্ট অবজেক্টের x নামক কোনো অ্যাট্রিবিউট নেই। এখন সমস্যা হল x বা y স্থানাঙ্ক ছাড়াই একটি বিন্দু বস্তু থাকা সম্ভব। এটার কোনো মানে হয় না কারণ যখনই আমরা কোনো বিন্দু নিয়ে কথা বলি, আমাদের জানতে হবে সেই বিন্দুটি কোথায় অবস্থিত। এই সমস্যাটি সমাধান করার জন্য, আমরা একটি কনস্ট্রাক্টর ব্যবহার করি। কনস্ট্রাক্টর হল একটি ফাংশন যা একটি বস্তু তৈরি করার সময় কল করা হয়।
এখানে আমরা একটি কনস্ট্রাক্টর ব্যবহার কিভাবে. প্রথমে, উপরের প্রোগ্রামে x এবং y স্থানাঙ্কের মানগুলি পাস করি।
point = Point(10, 20)
print(point.x)
এখন, আমাদের এই ক্লাসে কনস্ট্রাক্টর নামে একটি বিশেষ পদ্ধতি যোগ করতে হবে। এর সিনট্যাক্স এইরকম:
def __init__(self, x, y):
init
আরম্ভের জন্য সংক্ষিপ্ত, এবং এটি হল ফাংশন বা পদ্ধতি যা একটি নতুন পয়েন্ট অবজেক্ট তৈরি হলে কল করা হয়। x এবং y ঠিক পরে যোগ করা হয় self
দুটি অতিরিক্ত পরামিতি যোগ করতে।
এর পরে, আমাদের পাস করা মান অর্থাৎ 10 এবং 20-এ x এবং y ম্যাপ করা উচিত
self.x = x
self.y = y
আমরা ব্যবহার করি self
বর্তমান অবজেক্টের উল্লেখ করতে এবং তারপর আমরা "x" ফাংশনে পাস করা x আর্গুমেন্টে x অ্যাট্রিবিউট সেট করি। এই ভাবে, ব্যবহার করে init
পদ্ধতি, আমরা আমাদের অবজেক্ট শুরু করতে পারি। এই পদ্ধতিটিকে কনস্ট্রাক্টর হিসাবে উল্লেখ করা হয়। আমাদের প্রোগ্রাম চালানো যাক.
এখন, আমরা পরে x এবং y স্থানাঙ্ক পরিবর্তন করতে পারি। আসুন x সমন্বয় আপডেট করি:
point = Point(10, 20)
point.x = 11
print(point.x)
এখন, x স্থানাঙ্কটি মান 11 এ আপডেট করা হয়েছে।
ব্যায়াম
এখানে আপনার জন্য একটি আকর্ষণীয় ব্যায়াম আছে.
আমি চাই আপনি একজন ব্যক্তি নামক একটি নতুন ধরনের সংজ্ঞায়িত করুন। এই "ব্যক্তি" বস্তুগুলির একটি "" থাকা উচিতname
" বৈশিষ্ট্যের পাশাপাশি একটি "talk()
”পদ্ধতি।
এটি একটি সহজ কাজ এবং কয়েক মিনিটের বেশি সময় নেওয়া উচিত নয়।
সমাধান
এভাবে "ব্যক্তি" শ্রেণী সংজ্ঞায়িত করে শুরু করুন:
class Person:
self.name = name
আমরা পরে কনস্ট্রাক্টর সংজ্ঞায়িত করব। এখন, আমরা "ব্যক্তি" অবজেক্ট তৈরি করতে পারি। এর জন কল করা যাক
john = Person("John Smith")
print(john.name)
john.talk()
এখন, কোডের প্রথম অংশে যান এবং একটি কনস্ট্রাক্টর তৈরি করুন।
def __init__(self, name):
চূড়ান্ত কোড এই মত দেখাবে:
আপনি ক্লাস এবং কনস্ট্রাক্টরের সাথে একত্রে ফর্ম্যাট করা স্ট্রিং এবং অন্যান্য ধারণাগুলিও ব্যবহার করতে পারেন।
উত্তরাধিকার
উত্তরাধিকার হল ক্লাসের সাথে যুক্ত আরেকটি ধারণা যা আপনাকে একটি কোড পুনরায় ব্যবহার করতে দেয়।
কোড এই টুকরা বিবেচনা করুন.
class Dog:
def walk(self):
print("walk")
আমরা একটি "ওয়াক" পদ্ধতি সহ একটি ক্লাস "কুকুর" তৈরি করেছি। এই পদ্ধতিতে, আমরা কেবল টার্মিনালে হাঁটার বার্তা প্রিন্ট করছি। ধরা যাক, একটি বাস্তব প্রোগ্রামে, এখানে শুধুমাত্র একটি লাইনের পরিবর্তে 10 লাইন কোড রয়েছে। ভবিষ্যতে, যদি অন্য ক্লাসে "হাঁটা" পদ্ধতির প্রয়োজন হয়, আমাদের সেই সমস্ত কোড পুনরাবৃত্তি করতে হবে। এটা আদর্শ নয়।
প্রোগ্রামিং-এ, আমাদের DRY নামে একটি নীতি রয়েছে যা নিজেকে পুনরাবৃত্তি না করার জন্য সংক্ষিপ্ত। আসুন আমরা ভবিষ্যতে কোন এক সময় বলি, আমরা আমাদের "হাঁটা" পদ্ধতিতে একটি সমস্যা আবিষ্কার করি এবং যদি আমরা এই পদ্ধতিটি অন্য অনেক জায়গায় পুনরাবৃত্তি করে থাকি বা নকল করে থাকি, তাহলে আমাদের ফিরে আসতে হবে এবং আমরা এটির নকল করেছি এমন প্রতিটি জায়গায় সেই সমস্যার সমাধান করতে হবে। কোড তাই প্রোগ্রামিং-এ আমাদের দুবার কিছু সংজ্ঞায়িত করা উচিত নয়।
এই সমস্যার প্রতিকারের জন্য বিভিন্ন পদ্ধতি রয়েছে কিন্তু এখানে আমরা শিখতে যাচ্ছি যেটি নতুনদের জন্য সহজ এবং এটিকে উত্তরাধিকার বলা হয়। এই ক্ষেত্রে, আমরা আরেকটি শ্রেণী "স্তন্যপায়ী" তৈরি করব এবং সেই শ্রেণীতে আমাদের "হাঁটা" বৈশিষ্ট্যটি সংজ্ঞায়িত করব।
class Mammal:
def walk(self):
print("walk")
আমাদের "স্তন্যপায়ী" শ্রেণী সংজ্ঞায়িত করার পরে আমরা এইরকম বৈশিষ্ট্যগুলি পাস করতে উত্তরাধিকার ব্যবহার করতে পারি:
কুকুর এবং বিড়াল উভয় শ্রেণীই তাদের অভিভাবক শ্রেণীতে সংজ্ঞায়িত সমস্ত শ্রেণী পদ্ধতি উত্তরাধিকার সূত্রে প্রাপ্ত। এখন, আমরা এই মত কুকুরের জন্য নির্দিষ্ট পদ্ধতি যোগ করতে পারি:
class Dog:
def bark(self):
print("bark")
শেষ করি!
এটি ক্লাস, কনস্ট্রাক্টর এবং উত্তরাধিকার ধারণা সহ ক্লাসে কোড পুনরায় ব্যবহার করার বিষয়ে ছিল। এখন আমরা আমাদের সিরিজ শেষের কাছাকাছি। এই মুহুর্তে, আপনি পাইথনে ভাল, পঠনযোগ্য এবং সংক্ষিপ্ত কোড তৈরি করতে সক্ষম হবেন।
আমরা পরবর্তী লেকচারে মডিউল এবং প্যাকেজের ধারণা দেখব।
নির্দেশিকা সমন্ধে মতামত দিন