'স্ব' শব্দের উদ্দেশ্য কী?


1129

selfপাইথনের শব্দের উদ্দেশ্য কী ? আমি বুঝতে পারি এটি ক্লাস থেকে তৈরি নির্দিষ্ট অবজেক্টকে বোঝায়, তবে কেন এটি স্পষ্টভাবে প্যারামিটার হিসাবে প্রতিটি ফাংশনে যুক্ত করা দরকার তা আমি দেখতে পাচ্ছি না। উদাহরণস্বরূপ, রুবিতে আমি এটি করতে পারি:

class myClass
    def myFunc(name)
        @name = name
    end
end

যা আমি বুঝতে পারি, খুব সহজেই। তবে পাইথনে আমাকে অন্তর্ভুক্ত করা দরকার self:

class myClass:
    def myFunc(self, name):
        self.name = name

কেউ কি এর মাধ্যমে আমার সাথে কথা বলতে পারেন? এটি আমার (স্বীকারোক্তরূপে সীমাবদ্ধ) অভিজ্ঞতার মধ্য দিয়ে এসেছিল এমন কিছু নয়।


111
গুডো ভ্যান রসমের
আনবুবু

14
এছাড়াও আরও দেখুন "কেন 'স্ব' অবশ্যই পদ্ধতির সংজ্ঞা এবং কলগুলিতে স্পষ্টভাবে ব্যবহার করা উচিত": docs.python.org/faq/…
unutbu

37
"যা আমি বুঝতে পারি, খুব সহজেই" --- বেশ সাপেক্ষিক, আপনি কি ভাবেন না? এর @nameচেয়ে বেশি স্বজ্ঞাত কী করে self.name? উত্তরোত্তর, আইএমও আরও স্বজ্ঞাত।
সান্তা 0

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

9
আমি মনে করি না "স্পষ্টকৃত বর্ণিত চেয়ে ভাল" সত্যই এই নকশা পছন্দটি ভালভাবে ব্যাখ্যা করে explains @fooএবং self.fooসমানভাবে স্পষ্ট যেমন কোনও অন্তর্নিহিত রেজোলিউশন হওয়ার দরকার নেই (যেমন সি ++ তে উদাহরণস্বরূপ সদস্যরা নাম স্পেস ব্যবহার না করে "স্পষ্টভাবে" অ্যাক্সেস করতে পারবেন)। পার্থক্যটি হ'ল রুবি একটি নতুন শব্দার্থক (@) প্রবর্তন করেছে, যদিও পাইথন তা দেয় না। কোনও নতুন শব্দার্থবিজ্ঞানের পরিমান ভারবোসিটির পরিমাণ এড়ানো বা না নিখুঁতভাবে বিষয়ভিত্তিক। যদিও এটি লক্ষ করা উচিত যে বেশিরভাগ আধুনিক ভাষাগুলি এখানে একটি ধারণা প্রবর্তন করতে পছন্দ করে (যেমন পিএইচপি'র $ এটি, জেএস এর এটি)।
জিং

উত্তর:


710

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

পাইথন বৈশিষ্ট্যগুলি থেকে সাধারণ নামগুলি আলাদা করতে অন্য কিছু করতে পারত - রুবির মতো বিশেষ বাক্য গঠন বা সি ++ এবং জাভা এর মতো ঘোষণাপত্রের প্রয়োজন, বা সম্ভবত আরও কিছু আলাদা - তবে এটি হয়নি। পাইথন যা কিছু স্পষ্ট করে তোলে তা স্পষ্ট করে তোলে, যদিও এটি সর্বত্র তা করে না, উদাহরণস্বরূপ বৈশিষ্ট্যগুলির জন্য এটি করে। একারণে অ্যাট্রিবিউট বৈশিষ্ট্য নির্ধারণের জন্য কোন উদাহরণটি অর্পণ করা উচিত তা জানতে হবে এবং এজন্য এটির প্রয়োজন self.


23
@ জর্জি: clsক্লাস অবজেক্টকে বোঝায়, উদাহরণ বস্তু নয়
সাইলেন্টগোস্ট

17
@ সাইলেন্টগোস্ট: আসলে, প্রথম প্যারামিটারের নামটি আপনি যা চান তা হ'ল। শ্রেণিবদ্ধ পদ্ধতিতে, কনভেনশনটি ব্যবহার করা হয় clsএবং selfউদাহরণ পদ্ধতিগুলির জন্য এটি প্রচলিতভাবে ব্যবহৃত হয়। আমি চাইলে আমি selfশ্রেণিবদ্ধ এবং clsউদাহরণ পদ্ধতির জন্য ব্যবহার করতে পারি । আমিও ব্যবহার করতে পারতাম bobএবং fnordযদি আমার পছন্দ হয়।
সিঙ্গেলাইজেশন ইলিমিনেশন

67
আমি এটি আকর্ষণীয় মনে করি যে সম্প্রদায়টি এর thisপরিবর্তে পছন্দ করে নি selfselfপুরানো প্রোগ্রামিং ভাষাতে আমি সচেতন নই এমন কিছু ইতিহাস আছে কি ?
জুলস জিএম

24
@ জুলিয়াস দ্য selfমডুলা -৩ এর সম্মেলন থেকে এসেছেন, এই পছন্দ সম্পর্কে আরও তথ্যের জন্য এই উত্তরটি দেখুন । (অস্বীকৃতি: এটি আমার)।
বাকুরিউ

9
@ জুলিয়াস selfকীওয়ার্ড ( স্মার্টটাক , 1980) thisকীওয়ার্ডটির পূর্বাভাস দেয় (সি ++ থেকে)। দেখুন: স্ট্যাকওভারফ্লো
ওয়েস টার্নার

425

আসুন একটি সাধারণ ভেক্টর ক্লাস নেওয়া যাক:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

আমরা এমন একটি পদ্ধতি রাখতে চাই যা দৈর্ঘ্য গণনা করে। আমরা শ্রেণীর ভিতরে এটি সংজ্ঞায়িত করতে চাইলে এটি দেখতে কেমন হবে?

    def length(self):
        return math.sqrt(self.x ** 2 + self.y ** 2)

যখন আমরা এটি একটি বিশ্বব্যাপী পদ্ধতি / ফাংশন হিসাবে সংজ্ঞায়িত করি তখন এটি দেখতে কেমন হবে?

def length_global(vector):
    return math.sqrt(vector.x ** 2 + vector.y ** 2)

সুতরাং পুরো কাঠামোটি একই থাকে। আমি কীভাবে এটি ব্যবহার করতে পারি? যদি আমরা এক মুহুর্তের জন্য ধরে নিই যে আমরা lengthআমাদের Vectorক্লাসের জন্য কোনও পদ্ধতি রচনা করি নি , আমরা এটি করতে পারি:

Vector.length_new = length_global
v = Vector(3, 4)
print(v.length_new()) # 5.0

এই কাজ করে কারণ প্রথম প্যারামিটার length_global, যেমন পুনরায় ব্যবহার করা যেতে পারে selfমাপদণ্ড length_new। এটি একটি সুস্পষ্ট ছাড়া সম্ভব হবে না self


সুস্পষ্টর প্রয়োজনীয়তা বোঝার আর একটি উপায় selfহল পাইথন যেখানে কিছু সিনট্যাকটিকাল চিনি যুক্ত করেছে তা দেখা। আপনি যখন মনে রাখবেন, সেই মূলত, একটি কল পছন্দ

v_instance.length()

অভ্যন্তরীণভাবে রূপান্তরিত হয়

Vector.length(v_instance)

কোথায় selfফিট করে তা দেখতে সহজ You আপনি আসলে পাইথনে উদাহরণ পদ্ধতি লিখেন না; আপনি যা লেখেন তা ক্লাসের পদ্ধতি যা অবশ্যই প্রথম পরামিতি হিসাবে নজরে নেওয়া উচিত। এবং সেইজন্য, আপনাকে কোথাও স্পষ্টভাবে উদাহরণ প্যারামিটার রাখতে হবে।


4
ভেক্টর. দৈর্ঘ্য_নিউ = দৈর্ঘ্য_গ্লোবাল ... আমি আমার শ্রেণির ঘোষণায় আসলে সিনট্যাক্সটি ব্যবহার শুরু করেছি actually যখনই আমি কেবল অন্য শ্রেণীর কাছ থেকে কিছু পদ্ধতির উত্তরাধিকারী হতে চাই, আমি কেবল স্পষ্টভাবে পদ্ধতিগুলির রেফারেন্সটি অনুলিপি করি।
Jeeyoung Kim

2
এটা কি বলা উচিত যে অজগরটির "ইনস্ট্যান্স মেথড" কেবল স্ট্যাটিক গ্লোবাল পদ্ধতিগুলির একটি সিনট্যাকটিক চিনি (জাভা বা সি ++ এর মতো) একাধিক বৈশিষ্ট্যের প্যাকেজে প্যাকেজ প্রবেশ করে? --- আচ্ছা এটা একধরনের সত্য যেহেতু বহুবর্ষে, "এটি" (জাভা হিসাবে) বা "স্ব" এর আরও গুরুত্বপূর্ণ উদ্দেশ্য হ'ল আপনাকে পদ্ধতিগুলির সঠিক প্রয়োগ দেওয়া implementation পাইথন এটি আছে। সুতরাং myobj.someMethod () কল করা পাইথনে TheClassOfMyObj.someMethod (myobj) এর সমান। নোট করুন যে "TheClassOfMyObj" পাইথন দ্বারা "স্বয়ং" থেকে স্বয়ংক্রিয়ভাবে সন্ধান করা হয়েছে, অন্যথায় আপনাকে এটি খুঁজে বের করতে হবে।
টেডি টেডি

3
প্রকৃতপক্ষে, কেবল উদাহরণগুলি কেবল শ্রেণিবদ্ধ পদ্ধতি নয়, তবে পদ্ধতিগুলি কেবলমাত্র ফাংশন যা কোনও শ্রেণীর সদস্য, Vector.length_new = length_globalশো হিসাবে ।
রাশিউব

1
"এটি কাজ করে, কারণ দৈর্ঘ্য_গ্লোবালের প্রথম প্যারামিটারটি দৈর্ঘ্য_ নতুন করে স্ব প্যারামিটার হিসাবে পুনরায় ব্যবহার করা যেতে পারে an সুস্পষ্ট স্ব ছাড়া এটি সম্ভব হবে না" " - এটি ঠিক একই কাজ করবে। এটি অন্তর্নিহিত স্বের জন্য পুনরায় ব্যবহার করা হবে ... দ্বিতীয় উদাহরণটি একটি বিজ্ঞপ্তিযুক্ত যুক্তি there আপনাকে সেখানে স্পষ্টভাবে নিজেকে স্থাপন করতে হবে, কারণ অজগরটির স্বতন্ত্র স্ব প্রয়োজন।
করলি হরবাথ

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

419

ধরা যাক আপনার একটি শ্রেণি ClassAরয়েছে যার মধ্যে একটি পদ্ধতি রয়েছে যার দ্বারা methodAসংজ্ঞা দেওয়া আছে:

def methodA(self, arg1, arg2):
    # do something

এবং ObjectAএই শ্রেণীর একটি উদাহরণ।

এখন যখন ObjectA.methodA(arg1, arg2)ডাকা হয়, অজগর অভ্যন্তরীণভাবে এটি আপনার জন্য রূপান্তর করে:

ClassA.methodA(ObjectA, arg1, arg2)

selfপরিবর্তনশীল বস্তুর নিজেই বোঝায়।


93
আমি অন্যান্য সমস্ত উত্তর এবং ধরণের বোঝা পড়ি, আমি এইটি পড়েছি এবং তারপরে এটি সমস্ত অর্থবোধ করে।
শেঠ

3
এটা আমার জন্য এটি পেরেক!
বার্নার্ড 'বিটা বার্লিন' পর

2
রুবির মতো এই সাহসগুলি কেন ভিতরে রাখবেন না?
সিস টিমারম্যান

কিন্তু __init __ (স্ব) পদ্ধতিতে এটি স্ব স্ব গ্রহণ করে, তারপরেও অবজেক্টটি তৈরি না করেও কীভাবে এটি নিজের উল্লেখ করে?
সৌরভ

গুরুতরভাবে, এটি দেবলস্কির উদাহরণের চেয়ে অনেক ভাল কারণ এটি অত্যধিক জটিল নয় এবং লোকেরা ভেক্টরগুলির সাথে পরিচিত হতে পারে না।
NoName

215

যখন বস্তু তাত্ক্ষণিক হয়, তখন বস্তু নিজেই স্ব প্যারামিটারে চলে যায়।

এখানে চিত্র বর্ণনা লিখুন

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

এখানে চিত্র বর্ণনা লিখুন

অবজেক্টটি স্ব প্যারামিটারে পাস করা হয় যাতে বস্তু তার নিজস্ব ডেটা ধরে রাখতে পারে।

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

নীচের চিত্র দেখুন:

এখানে চিত্র বর্ণনা লিখুন


আরে, যখন "bob.name ()" উদাহরণস্বরুপ বব গুণাবলী অ্যাক্সেস, আপনি আসলে বব অ্যাক্সেস করার ()। Self.name তাই 'থেকে কথা বলতে Init ' ঠিক আছে?
udarH3

3
উপরের মন্তব্যে আপনি bob.name () লিখলে আপনি বোঝাচ্ছেন যে নামের পরে বন্ধনী যুক্ত করার কারণে বোবটির নাম () নামে একটি পদ্ধতি রয়েছে। এই উদাহরণে তবে এ জাতীয় কোনও পদ্ধতি নেই। 'bob.name' (যার কোনও বন্ধনী নেই) সরাসরি init (কনস্ট্রাক্টর) পদ্ধতি থেকে নাম নামক বৈশিষ্ট্যটি অ্যাক্সেস করছে। যখন ববের স্পোক পদ্ধতিটি বলা হয় তখন এটি সেই পদ্ধতি যা নামের বৈশিষ্ট্যটি অ্যাক্সেস করে এবং মুদ্রণ বিবৃতিতে ফেরত দেয়। আশাকরি এটা সাহায্য করবে.
sw123456

3
না, আপনি নিজের নামটির মান পাবেন যা বব অবজেক্টের জন্য আসলে বব.নাম, কারণ যখন এটি তৈরি হয় (তাত্ক্ষণিক) তখন বস্তুর নাম স্ব প্যারামিটারে যায়। আবার, আশা করি এটি সাহায্য করবে। মূল পোস্ট থাকলে তা নির্দ্বিধায় মনে করুন।
sw123456

2
নাম তাত্ক্ষণিক সময়ে স্ব.নামে অর্পিত হয়। কোনও অবজেক্ট তৈরি হওয়ার পরে, অবজেক্টের সাথে সম্পর্কিত সমস্ত ভেরিয়েবলগুলি সেগুলি 'সেল্ফ' দিয়ে প্রিফিক্সড। মনে রাখবেন যে ক্লাস থেকে তৈরি হয়ে গেলে বস্তুর নাম দিয়ে স্ব প্রতিস্থাপন করা হয়।
sw123456

5
আপনি স্টাফ ব্যাখ্যা কিভাবে এইভাবে! সুন্দর কাজ :)
পেন্টা

80

আমি এই উদাহরণটি পছন্দ করি:

class A: 
    foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
ans: [5]

class A: 
    def __init__(self): 
        self.foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
ans: []

18
স্ব-বিহীন ভারগুলি কেবল শ্রেণির স্থির ভার, জাভা
টেডি টেডি

5
টেডি টেডি, আপনি পুরোপুরি সঠিক নন। আচরণ (স্থিতিশীল বা অ-স্থিতিশীল মত) কেবল নির্ভর করে না selfতবে চলক ধরণের উপরও নির্ভর করে। তালিকার পরিবর্তে সাধারণ পূর্ণসংখ্যার সাথে প্রথম উদাহরণটি করার চেষ্টা করুন। ফলাফলটি অন্যরকম হবে।
কনস্টান্টিন

2
আসলে, এই সঙ্গে আমার প্রশ্ন আপনি কেন a.fooপ্রথম উদাহরণে বলতে চেয়ে অনুমতি দেওয়া হয় , না A.foo? স্পষ্টতই fooক্লাসের অন্তর্গত ...
র‌্যাডন রোসবারো

আপনি বেশিরভাগ ভাষায় অবজেক্টের উদাহরণ থেকে স্থির সদস্যদের কল করতে পারেন। কেন অবাক লাগছে?
পার্থ

2
@ রেডনরোসবারো কারণ প্রথম উদাহরণে aএবং bউভয় লেবেল (বা পয়েন্টার) A()(ক্লাস) এর জন্য। ক্লাস পদ্ধতি a.fooরেফারেন্স A().foo। দ্বিতীয় উদাহরণে, যদিও, aএকটি একটি রেফারেন্স হয়ে উদাহরণস্বরূপ এর A(), যেমন করে b। এখন যেহেতু তারা ক্লাস অবজেক্টের পরিবর্তে উদাহরণস্বরূপ, স্বfoo পদ্ধতিটি দৃষ্টান্তগুলিতে কাজ করার অনুমতি দেয় ।
কিংবদন্তি

40

আমি এমন কোড দিয়ে দেখাব যা ক্লাস ব্যবহার করে না :

def state_init(state):
    state['field'] = 'init'

def state_add(state, x):
    state['field'] += x

def state_mult(state, x):
    state['field'] *= x

def state_getField(state):
    return state['field']

myself = {}
state_init(myself)
state_add(myself, 'added')
state_mult(myself, 2)

print( state_getField(myself) )
#--> 'initaddedinitadded'

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

এখন আসুন মূলত একই জিনিসটি কীভাবে তা দেখানোর জন্য বিল্ট-ইন পাইথন ক্লাসের যন্ত্রপাতিটি ব্যবহার করে উপরের কোডটি প্রদর্শন করুন।

class State(object):
    def __init__(self):
        self.field = 'init'
    def add(self, x):
        self.field += x
    def mult(self, x):
        self.field *= x

s = State()
s.add('added')    # self is implicitly passed in
s.mult(2)         # self is implicitly passed in
print( s.field )

[সদৃশ বন্ধ প্রশ্ন থেকে আমার উত্তর স্থানান্তরিত]


1
আমি আশা করি পাইথন হ্যান্ডলারের পাশাপাশি রুবিকে চিনুকৃত করে দিয়েছে।
সিস টিমারম্যান

20

নীচের অংশগুলি স্ব সম্পর্কে পাইথন ডকুমেন্টেশন থেকে প্রাপ্ত :

মডিউলা -৩ এর মতো, বস্তুর সদস্যদের তার পদ্ধতিগুলি থেকে রেফারেন্স করার জন্য [পাইথনের মধ্যে] কোনও সংক্ষিপ্তপদ নেই: পদ্ধতি ফাংশনটি একটি স্পষ্ট প্রথম যুক্তি দ্বারা অবজেক্টটির প্রতিনিধিত্ব করে ঘোষণা করা হয়, যা কল দ্বারা স্পষ্টভাবে সরবরাহ করা হয়।

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

আরও তথ্যের জন্য ক্লাসের পাইথন ডকুমেন্টেশন টিউটোরিয়াল দেখুন


20

পাশাপাশি ইতিমধ্যে বর্ণিত অন্যান্য সমস্ত কারণ, এটি ওভাররাইড পদ্ধতিতে আরও সহজে অ্যাক্সেসের অনুমতি দেয়; আপনি কল করতে পারেন Class.some_method(inst)

এটি দরকারী যেখানে একটি উদাহরণ:

class C1(object):
    def __init__(self):
         print "C1 init"

class C2(C1):
    def __init__(self): #overrides C1.__init__
        print "C2 init"
        C1.__init__(self) #but we still want C1 to init the class too
>>> C2()
"C2 init"
"C1 init"

17

thisজাভাতে কীওয়ার্ড ব্যবহারের অনুরূপ এটির ব্যবহারের অর্থ , বর্তমানের বস্তুর রেফারেন্স দিতে।


2
ক্লাস মাই ক্লাস: ডিফ মাইফঙ্ক (এটি, নাম): এই.নাম = নাম
লেমুয়েল এডান

16

পাইথন জাভা বা সি ++ এর বিপরীতে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের জন্য নির্মিত ভাষা নয়।

পাইথনে স্থিতিশীল পদ্ধতি কল করার সময়, কেউ কেবল তার অভ্যন্তরে নিয়মিত যুক্তি সহ একটি পদ্ধতি লেখেন।

class Animal():
    def staticMethod():
        print "This is a static method"

যাইহোক, একটি অবজেক্ট পদ্ধতি, যার জন্য আপনাকে একটি ভেরিয়েবল তৈরি করতে হবে, যা একটি প্রাণী, এক্ষেত্রে স্ব-যুক্তির প্রয়োজন

class Animal():
    def objectMethod(self):
        print "This is an object method which needs an instance of a class"

শ্রেণীর মধ্যে একটি চলক ক্ষেত্র উল্লেখ করতে স্ব-পদ্ধতিটিও ব্যবহৃত হয়।

class Animal():
    #animalName made in constructor
    def Animal(self):
        self.animalName = "";


    def getAnimalName(self):
        return self.animalName

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

আমি যা বলছি তার একটি শব্দও যদি আপনি বুঝতে না পারেন, তবে গুগল "অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং"। একবার আপনি এটি বুঝতে পারলে, আপনার এমনকি সেই প্রশ্ন জিজ্ঞাসা করার প্রয়োজন হবে না :)।


staticMethod()এবং এর মধ্যে পার্থক্যের কারণে +1 objectMethod(self)। আমি এটি যুক্ত করতে চাই Animal.staticMethod()objectMethod()a = Animal(); a.objectMethod()
প্রথমটি চাওয়ার জন্য

আপনি যা বলছেন তা 100% সত্য নয়। এটি কেবল একটি সম্মেলন। আপনি এখনও তৈরি একটি বস্তু থেকে স্থিতিশীল পদ্ধতি কল করতে পারেন। আপনি কোনও শ্রেণীর সদস্যকে ব্যবহার করতে পারবেন না কারণ আপনি কোনও স্ব-ঘোষনা করেন নি। আমি অ্যান্টিস্টিক কল করতে এমনকি অ্যানিমাল.ওজেক্টমেথড (এ্যানিমেল ওবিজে) কল করতে পারি। মূলত এর অর্থ একটি স্ট্যাটিক পদ্ধতি কেবল এমন একটি পদ্ধতি যা সদস্য ভেরিয়েবলগুলি ব্যবহার করে না। আত্ম ঘোষণা করার কোনও দরকার নেই। আমি মনে করি এটি একটি নির্বোধ ভাষার প্রয়োজনীয়তা। লুয়া এবং সি ++ এর মতো ভাষা আপনাকে পর্দার আড়ালে ভেরিয়েবল দেয়।
ব্যবহারকারী 441521

আপনি একটি অকেজো পশুর নাম স্ট্রিং ডিক্লেয়ারেশন এবং ক্র্যাশিং অ্যানিমেল নাম পদ্ধতি করেছেন।
সিস টিমারম্যান

3
@ytpillai অপ্রাসঙ্গিক বিভ্রান্তিকর এবং ভুল কোড উত্তর হিসাবে উপস্থাপন করা উচিত নয়।
সিস টিমারম্যান

1
def getAnimalNameআপনি যে স্ট্রিংটি ফিরে আসার চেষ্টা করছেন তা ক্লাববার না করে এবং selfশ্রেণীর উদাহরণটিকে বোঝায়, এর কোনও ক্ষেত্র নয়।
সিস টিমারম্যান

10

পাইথন জেনটি অনুসরণ করার জন্য সেখানে "স্পষ্টকৃতের চেয়ে আরও ভাল ভাল" ” এটি প্রকৃতপক্ষে আপনার শ্রেণীর অবজেক্টের একটি রেফারেন্স। জাভা এবং পিএইচপিতে, উদাহরণস্বরূপ, এটি বলা হয় this

যদি user_type_nameআপনার মডেলের ক্ষেত্র হয় তবে আপনি এটির মাধ্যমে অ্যাক্সেস করতে পারেন self.user_type_name


10

প্রথমত, স্ব একটি প্রচলিত নাম, আপনি এর স্থানে অন্য কিছু (সুসংগত) রাখতে পারেন।

এটি নিজেই অবজেক্টটিকে বোঝায়, সুতরাং আপনি যখন এটি ব্যবহার করছেন তখন আপনি ঘোষণা করছেন যে .name এবং .age হ'ল শিক্ষার্থী অবজেক্টের বৈশিষ্ট্য (নোট, শিক্ষার্থী শ্রেণীর নয়) আপনি তৈরি করতে যাচ্ছেন।

class Student:
    #called each time you create a new Student instance
    def __init__(self,name,age): #special method to initialize
        self.name=name
        self.age=age

    def __str__(self): #special method called for example when you use print
        return "Student %s is %s years old" %(self.name,self.age)

    def call(self, msg): #silly example for custom method
        return ("Hey, %s! "+msg) %self.name

#initializing two instances of the student class
bob=Student("Bob",20)
alice=Student("Alice",19)

#using them
print bob.name
print bob.age
print alice #this one only works if you define the __str__ method
print alice.call("Come here!") #notice you don't put a value for self

#you can modify attributes, like when alice ages
alice.age=20
print alice

কোড এখানে


1
আপনার উত্তরটি আমার কাছে সবচেয়ে স্পষ্ট মনে হয়েছে। +1
পাভেল

9

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


8

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

1: স্ব ব্যবহারের ব্যাখ্যা

মনে রাখবেন এটি কোনও কীওয়ার্ড নয়।

Init সহ প্রতিটি শ্রেণি পদ্ধতির প্রথম যুক্তি সর্বদা শ্রেণীর বর্তমান উদাহরণের একটি রেফারেন্স। কনভেনশন দ্বারা, এই যুক্তির নাম সর্বদা স্বযুক্ত করা হয়। আর ডি পদ্ধতিতে স্ব নতুনভাবে নির্মিত বস্তুকে বোঝায়; অন্যান্য শ্রেণি পদ্ধতিতে এটি উদাহরণটিকে বোঝায় যার পদ্ধতিটি ডাকা হত। উদাহরণস্বরূপ নীচের কোডটি উপরের কোডের মতো।

2: কেন এটি আমাদের কাছে এটি আছে এবং কেন আমরা এটিকে জাভার মতো একটি যুক্তি হিসাবে মুছে ফেলতে পারি না এবং এর পরিবর্তে একটি কীওয়ার্ড রাখতে পারি না?

আরেকটি জিনিস আমি যুক্ত করতে চাই, একটি alচ্ছিক selfযুক্তি আমাকে ক্লাসের ভিতরে স্থির পদ্ধতিগুলি না লিখে লিখে ঘোষণা করতে দেয় self

কোড উদাহরণ:

class MyClass():
    def staticMethod():
        print "This is a static method"

    def objectMethod(self):
        print "This is an object method which needs an instance of a class, and that is what self refers to"

পিএস : এটি কেবল পাইথন 3.x এ কাজ করে।

পূর্ববর্তী সংস্করণগুলিতে, আপনাকে স্পষ্টভাবে @staticmethodসাজসজ্জা যুক্ত করতে হবে, অন্যথায় selfযুক্তি বাধ্যতামূলক।


7

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


6

নিম্নলিখিত উদাহরণটি দেখুন, যা স্পষ্টভাবে এর উদ্দেশ্য ব্যাখ্যা করে self

class Restaurant(object):  
    bankrupt = False

    def open_branch(self):
        if not self.bankrupt:
           print("branch opened")

#create instance1
>>> x = Restaurant()
>>> x.bankrupt
False

#create instance2
>>> y = Restaurant()
>>> y.bankrupt = True   
>>> y.bankrupt
True

>>> x.bankrupt
False  

self উদাহরণগুলির মধ্যে পার্থক্য করার জন্য ব্যবহৃত / প্রয়োজন হয়।

উত্স: পাইথনে স্ব ভেরিয়েবল ব্যাখ্যা করেছেন - পাইথনটিপস


হ্যাঁ, আমি মনে করি আমরা জানি কেন স্ব ব্যবহার করা হয় তবে প্রশ্নটি কেন ভাষা আপনাকে এটিকে স্পষ্টভাবে ঘোষণা করে। অন্যান্য অনেক ভাষার জন্য এটির প্রয়োজন হয় না এবং এমন একটি ভাষা যা সংক্ষিপ্ত হওয়ার জন্য নিজেকে গর্বিত করে, আপনার মনে হয় তারা লুয়া বা সি ++ (এটি) এর মতো ব্যবহারের জন্য আপনাকে কেবল পর্দার আড়ালের পরিবর্তনশীল দেবে।
ব্যবহারকারী 441521

3
@ কুমারিও ২৩ আপনার প্রতিক্রিয়াটি এখান থেকে এসেছিল : পাইথোনটিপস.কম / ২০১৩ / ২০১৮ / ০/ / নিজেকে- পরিবর্তনশীল- ইন- পাইথন- এক্সপ্লাইন্ড দয়া করে উত্তরগুলি নিজের হিসাবে পোস্ট করার সময় সর্বদা মূল লেখককে স্বীকার করুন।
গিকিধারার্স

@ জেকিধর্ষসকে ধন্যবাদ, আমি একটি নোট যুক্ত করেছি!
কুমারিও 23

5

কারণ অজগরটি ডিজাইন করা হয়েছে বিকল্পগুলি খুব কমই কাজ করবে। পাইথন এমন এক পদ্ধতিতে বা পদ্ধতিতে সংজ্ঞায়িত করার জন্য ডিজাইন করা হয়েছে যেখানে অন্তর্নিহিত this(a-la জাভা / সি ++) বা স্পষ্টত @(a-la রুবি) উভয়ই কাজ করবে না। পাইথন কনভেনশনগুলির সাথে সুস্পষ্ট পদ্ধতির সাথে একটি উদাহরণ দেওয়া যাক:

def fubar(x):
    self.x = x

class C:
    frob = fubar

এখন fubarফাংশনটি কার্যকর হবে না কারণ এটি ধরে নেওয়া হবে যে selfএটি একটি বৈশ্বিক পরিবর্তনশীল (এবং frobপাশাপাশি)। বিকল্পটি selfহ'ল প্রতিস্থাপিত বৈশ্বিক সুযোগ (যেখানে বস্তুটি আছে) এর সাথে পদ্ধতির কার্যকর করতে হবে ।

অন্তর্নিহিত পদ্ধতির হবে

def fubar(x)
    myX = x

class C:
    frob = fubar

এর অর্থ হ'ল এটি myXস্থানীয় ভেরিয়েবল হিসাবে ব্যাখ্যা করা হবে fubar(এবং frobপাশাপাশি)। এখানে বিকল্প হ'ল কলগুলির মধ্যে বজায় রাখা একটি প্রতিস্থাপিত স্থানীয় স্কোপ সহ পদ্ধতিগুলি কার্যকর করা হবে, তবে এটি পদ্ধতি স্থানীয় ভেরিয়েবলগুলির পজিবিলিটি সরিয়ে ফেলবে।

তবে বর্তমান পরিস্থিতি ভালভাবে কাজ করে:

 def fubar(self, x)
     self.x = x

 class C:
     frob = fubar

এখানে যখন বলা হিসাবে একটি পদ্ধতি frobবস্তুর উপর এটি মাধ্যমে বলা হচ্ছে পাবেন selfপরামিতি, এবং fubarএখনও প্যারামিটার হিসাবে একটি বস্তুর সঙ্গে বলা যেতে পারে এবং একই কাজ (এটা হল একই হিসাবে C.frobআমি মনে করি)।


3

ইন __init__পদ্ধতি, স্ব নব নির্মিত বস্তু বোঝায়; অন্যান্য শ্রেণি পদ্ধতিতে এটি উদাহরণটিকে বোঝায় যার পদ্ধতিটি ডাকা হত।

স্ব, একটি নাম হিসাবে, এটি কেবল একটি কনভেনশন , এটিকে আপনার পছন্দ মতো কল করুন! তবে এটি ব্যবহার করার সময়, বস্তুটি মোছার জন্য, আপনাকে একই নাম ব্যবহার করতে হবে:, __del__(var)যেখানে varব্যবহৃত হয়েছিল__init__(var,[...])

আপনার আরও একবার দেখে নেওয়া উচিত cls, আরও বড় ছবি পেতে । এই পোস্ট সহায়ক হতে পারে।


3

স্ব বর্তমান বামের নাম বা শ্রেণীর উদাহরণের মতো অভিনয় করছে।

# Self explanation.


 class classname(object):

    def __init__(self,name):

        self.name=name
        # Self is acting as a replacement of object name.
        #self.name=object1.name

   def display(self):
      print("Name of the person is :",self.name)
      print("object name:",object1.name)


 object1=classname("Bucky")
 object2=classname("ford")

 object1.display()
 object2.display()

###### Output 
Name of the person is : Bucky
object name: Bucky
Name of the person is : ford
object name: Bucky

1

self অনিবার্য

এখানে কেবল একটি প্রশ্নself অন্তর্নিহিত বা স্পষ্ট হওয়া উচিত । Guido van Rossumএই প্রশ্নের বলছে সমাধান selfথাকার হয়েছে

তাহলে কোথায় selfথাকবেন?

আমরা যদি কেবল ক্রিয়ামূলক প্রোগ্রামিংয়ের সাথে লেগে থাকি তবে আমাদের প্রয়োজন হবে না selfপাইথন ওওপি প্রবেশ করার পরে আমরা selfসেখানে খুঁজে পাই ।

class Cপদ্ধতিটির সাথে টিপিকাল ইউজ কেসটি এখানেm1

class C:
    def m1(self, arg):
        print(self, ' inside')
        pass

ci =C()
print(ci, ' outside')
ci.m1(None)
print(hex(id(ci))) # hex memory address

এই প্রোগ্রাম আউটপুট হবে:

<__main__.C object at 0x000002B9D79C6CC0>  outside
<__main__.C object at 0x000002B9D79C6CC0>  inside
0x2b9d79c6cc0

সুতরাং selfক্লাস উদাহরণ মেমরি ঠিকানা রাখা। উদ্দেশ্য এর selfজন্য রেফারেন্স রাখা হবে উদাহরণস্বরূপ পদ্ধতি এবং আমাদের নিজের কাছে স্পষ্ট যে রেফারেন্স অ্যাক্সেসের অনুমোদন দেয়।


নোট এখানে তিন ধরণের শ্রেণিবদ্ধ পদ্ধতি রয়েছে:

  • স্থিতিশীল পদ্ধতি (পড়ুন: ফাংশন),
  • শ্রেণি পদ্ধতি,
  • উদাহরণ পদ্ধতি (উল্লিখিত)

0

ডক্স থেকে ,

পদ্ধতিগুলির বিশেষ বিষয়টি হ'ল দৃষ্টান্তের অবজেক্টটি ফাংশনের প্রথম আর্গুমেন্ট হিসাবে পাস করা হয়। আমাদের উদাহরণে, কলটি x.f()ঠিক সমান MyClass.f(x)। সাধারণভাবে, এন আর্গুমেন্টের একটি তালিকা সহ একটি পদ্ধতি কল করা যুক্তি তালিকার সাথে সংশ্লিষ্ট ফাংশনটি কল করার সমতুল্য যা প্রথম যুক্তির আগে পদ্ধতির উদাহরণ আইটেম সন্নিবেশ করে তৈরি করা হয়।

এটি সম্পর্কিত স্নিপেটের আগে,

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

x = MyClass()


-2

এটি শ্রেণীর উদাহরণ অবজেক্টের একটি স্পষ্ট উল্লেখ।


21
আমি মনে করি না এটি সমৃদ্ধজিলাকে এর পিছনের কারণটি বুঝতে সহায়তা করে।
জর্জি স্কলি

1
@ সাইলেন্টগোস্ট: আপনি এটি পেরেক দিয়ে গেছেন। আমি মুগ্ধ. যদি আমি এটি সঠিকভাবে বুঝতে পারি: আমি সংজ্ঞায়িত শ্রেণীর উদাহরণ হিসাবে কোনও বস্তু তৈরি করি এবং স্ব পরামিতিটি সেই বস্তুকে বোঝায়? আমি বুঝতে পারি স্ব শ্রেণীর মধ্যেই নিখুঁতভাবে বোঝায় তবে আপনি নিজের উত্তরটি আরও কিছুটা ব্যাখ্যা করলে এটি দুর্দান্ত হবে be
dkrynicki
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.