সেলফ (self) কিওয়ার্ড নিয়ে অনেকদিন থেকেই কনফিউশনে আছি। ঠিক বুঝতে পারছি না যে এটা আসলে কি কাজ করে বা এটার দরকারই বা কি। সেলফ কিওয়ার্ডটা বাদ দিয়ে পাইথনে ক্লাস/অবজেক্ট তৈরি করা যাবে কি?

asked 09 Oct, 14:57

Rabiul%20Islam's gravatar image

Rabiul Islam
235

edited 09 Oct, 16:17

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
3115


class Rectangle():
    def set_dimensions(self, length, width):
        self.length = length
        self.width = width
    def get_area(self):
        return self.length * self.width

rectangle = Rectangle()
rectangle.set_dimensions(5, 4)
print(rectangle.get_area()) # 20

প্রথমেই বলে রাখি, self কোন কিওয়ার্ড না। এটা একটা ভ্যারিয়েবলের নাম। আমরা যেভাবে অন্য যেকোনো ভ্যারিয়েবলের নাম নিজেরা ঠিক করে দেই, একই ভাবে এখানে self এর যায়গায় অন্য যেকোনো নাম দিয়েই কাজটা করা যেত। কনভেনশন অনুযায়ী এই ভ্যারিয়েবলটাকে self নাম দেওয়া হয়ে থাকে।

self (বা অন্য যে নামই দিই না কেন) ছাড়া কোড লেখা যাবে না। পাইথনে যখন কোন একটা ক্লাস লেখা হয় এবং সেই ক্লাসে একটা মেথড লেখা হয়, পাইথন নিজে থেকেই সেই মেথডের প্রথম প্যারামিটার হিসাবে একটা আর্গুমেন্ট পাস করে। যেহেতু পাইথন নিজে থেকেই সবসময়ই এই আর্গুমেন্ট পাস করবে, সেহেতু আমরা এটা ব্যবহার করতে বাধ্য।

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

আমরা যদি কোন প্যারামিটার নাও নিতে চাই, তবুও যেই অবজেক্ট থেকে মেথড কল করা হবে, পাইথন সেই অবজেক্টের রেফারেন্স পাঠাবে। একারণে আমরা get_area মেথডে একটা প্যারামিটার রেখেছি যদিও কল করার সময় কোন আর্গুমেন্ট পাঠাইনি। যখন আমরা rectangle.get_area() কল করলাম, তখন পাইথন নিজে থেকে rectangle অবজেক্টটাকে get_area মেথডের ভেতরে পাঠিয়ে দেয়। rectangle.get_area() কলটা বাস্তবে অনেকটা এরকম হয়ে যায়, get_area(rectangle)। এভাবে পাইথন যখন আমাদেরকে অবজেক্টের রেফারেন্সটা পাঠিয়ে দেয়, তখন আমরা সেটা ব্যবহার করে মেথডের ভেতরে থেকে ঐ অবজেক্টের অন্য্যন্য ভেরিয়েবল বা মেথড ব্যবহার করতে পারি, যেমনটা করে আমরা get_area এর ভেতরে সেই অবজেক্টের length এবং width ব্যবহার করতে পারছি।

permanent link

answered 09 Oct, 15:44

anindyaspaul's gravatar image

anindyaspaul
363

edited 09 Oct, 16:24

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
3115

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×59
×26
×1
×1

question asked: 09 Oct, 14:57

question was seen: 573 times

last updated: 09 Oct, 16:24