পাইথনে __init__ এবং স্ব কী করেন?


790

আমি পাইথন প্রোগ্রামিংয়ের ভাষা শিখছি এবং আমি এমন কিছু উপস্থিত করেছি যা আমি পুরোপুরি বুঝতে পারি না।

এমন পদ্ধতিতে:

def method(self, blah):
    def __init__(?):
        ....
    ....

কি করে self? এর অর্থ কী? এটা কি বাধ্যতামূলক?

__init__পদ্ধতিটি কী করে ? কেন এটি প্রয়োজনীয়? (ইত্যাদি)

আমি মনে করি এগুলি ওওপি নির্মাণ হতে পারে তবে আমি খুব বেশি জানি না।

উত্তর:


583

এই কোডে:

class A(object):
    def __init__(self):
        self.x = 'Hello'

    def method_a(self, foo):
        print self.x + ' ' + foo

... selfভেরিয়েবল নিজেই বস্তুর উদাহরণ উপস্থাপন করে। বেশিরভাগ অবজেক্ট-ওরিয়েন্টেড ল্যাঙ্গুয়েজগুলি কোনও বস্তুর উপর সংজ্ঞায়িত পদ্ধতিতে এটি একটি লুকানো প্যারামিটার হিসাবে পাস করে; পাইথন না। আপনি এটি স্পষ্টভাবে ঘোষণা করতে হবে। আপনি যখন Aক্লাসের কোনও উদাহরণ তৈরি করেন এবং এর পদ্ধতিগুলি কল করেন, এটি স্বয়ংক্রিয়ভাবে পাস হয়ে যাবে, যেমন ...

a = A()               # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument

__init__পদ্ধতি কি পাইথন একটি কন্সট্রাকটর প্রতিনিধিত্ব করে মোটামুটিভাবে হয়। আপনি যখন কল করেন A()পাইথন আপনার জন্য একটি অবজেক্ট তৈরি করে এবং এটিকে __init__পদ্ধতির প্রথম পরামিতি হিসাবে পাস করে । কোনও অতিরিক্ত প্যারামিটার (যেমন, A(24, 'Hello')) আর্গুমেন্ট হিসাবেও পাস হবে - এক্ষেত্রে কোনও ব্যতিক্রম উত্থাপিত হতে পারে, যেহেতু নির্মাণকারী তাদের আশা করে না।


8
আপনি যদি ক্লাসের x = 'Hello'বাইরে কিন্তু ডিআইএম রাখেন তবে? এটি কি জাভার মতো যেখানে এটি একই, বা এটি স্থির পরিবর্তনশীলের মতো হয়ে যায় যা কেবল একবার শুরু করা হয়?
জয়েন

15
এটি স্ট্যাটিক ভেরিয়েবলের মতো। এটা শুধুমাত্র একবার সক্রিয়া, এবং এটি উপলব্ধ মাধ্যমে এর A.xবা a.x। লক্ষ্য করুন একটি নির্দিষ্ট শ্রেণী তে এটি অগ্রাহ্য বেস প্রভাবিত করবে না, তাই A.x = 'foo'; a.x = 'bar'; print a.x; print A.xপ্রিন্ট হবে barতারপরfoo
ক্রিস বি

155
এটি উল্লেখ করা মূল্যবান যে প্রথম যুক্তিটি অগত্যা বলা প্রয়োজন নয় self, এটি কেবল কনভেনশন দ্বারা।
হেনরি গোমারসাল

13
objectশ্রেণির ঘোষণার মূল বিষয় কী ? আমি দেখেছি কিছু ক্লাসের এটি রয়েছে এবং
ক্রিস

9
@ ক্রিস এটি পাইথন 2 সামঞ্জস্যের জন্য। পাইথন 3 এ স্পষ্টভাবে উত্তরাধিকারী হওয়ার দরকার নেই objectকারণ এটি ডিফল্টরূপে ঘটে।
গ্যাব্রিয়েল

241

হ্যাঁ, আপনি ঠিক বলেছেন, এগুলি ওওপ কনস্ট্রাক্টস।

__init__একটি শ্রেণীর জন্য নির্মাতা। selfপ্যারামিটার (মত বস্তুর উদাহরণস্বরূপ বোঝায় thisC ++)।

class Point:
    def __init__(self, x, y):
        self._x = x
        self._y = y

__init__পদ্ধতি বলা পরার যখন বস্তুর জন্য মেমরি বরাদ্দ করা হয়:

x = Point(1,2)

selfআপনি যদি বস্তুর সাথে মানটি বজায় রাখতে চান তবে কোনও অবজেক্টের পদ্ধতির অভ্যন্তরে প্যারামিটারটি ব্যবহার করা গুরুত্বপূর্ণ । উদাহরণস্বরূপ, আপনি যদি __init__পদ্ধতিটি এভাবে প্রয়োগ করেন :

class Point:
    def __init__(self, x, y):
        _x = x
        _y = y

আপনার xএবং yপরামিতিগুলি স্ট্যাকের ভেরিয়েবলগুলিতে সংরক্ষণ করা হবে এবং যখন init পদ্ধতিটি সুযোগের বাইরে চলে যাবে তখন ফেলে দেওয়া হবে। সেই ভেরিয়েবলগুলি হিসাবে সেট করা self._xএবং self._yসেই ভেরিয়েবলগুলিকে Pointঅবজেক্টের সদস্য হিসাবে নির্ধারণ করে (বস্তুর আজীবন অ্যাক্সেসযোগ্য)।


1
তাহলে কি কোনও কারণ আছে যে আপনি selfকনস্ট্রাক্টরে থাকতে চান না ? কেন আপনি এমনকি এটি নির্দিষ্ট করতে হবে, এটি অন্তর্ভুক্ত থাকলে আরও ভাল হত না?
অ্যারন ফ্র্যাঙ্ক

আমি যতদূর জানি, __ init __ কোনও নির্মাণকারী নয়, এটি প্রথম পদ্ধতি যা কোনও বস্তু তৈরি হওয়ার পরে কার্যকর করা হবে, __ init __ অবজেক্ট সেটআপ করার জন্য ব্যবহৃত হয়। অজগরের নির্মাতা হলেন __ নতুন __।
দীপানশু

206

একটি সংক্ষিপ্ত উদাহরণস্বরূপ উদাহরণ

এই আশায় এটি সামান্য সাহায্য করতে পারে, এখানে ক্লাসের মধ্যে ঘোষিত ভেরিয়েবল এবং একটি __init__ফাংশনের অভ্যন্তরে ঘোষিত ভেরিয়েবলের মধ্যে পার্থক্য বুঝতে আমি এখানে একটি সাধারণ উদাহরণ দিচ্ছি :

class MyClass(object):
    i = 123
    def __init__(self):
        self.i = 345

a = MyClass()
print(a.i)
print(MyClass.i)

আউটপুট:

345
123

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

34
এই উদাহরণটি দিয়েই আমি 'নিজেকে বোঝানোর' চেষ্টা করছিলাম - এটি যে পরিবর্তনশীলটি সেট করে __init__তা ক্লাসের উদাহরণগুলিতে পাস হয় , ক্লাসের একই নাম থাকা 'স্ট্যাটিক' ভেরিয়েবল নয় ...
ডেভ এভারিট

44

সংক্ষেপে:

  1. selfযেমন এটি প্রস্তাব দেয়, নিজেকে বোঝায় - অবজেক্টটি যাকে পদ্ধতি বলে। এটি হ'ল, যদি পদ্ধতিটিতে কল করার জন্য আপনার কাছে N বস্তু থাকে, তবে self.aপ্রতিটি এন বস্তুর জন্য পৃথক পৃথক উদাহরণটি উল্লেখ করা হবে। aপ্রতিটি বস্তুর জন্য ভেরিয়েবলের এন কপিগুলি কল্পনা করুন
  2. __init__অন্যান্য ওওপি ভাষায় যেমন সি ++ / জাভা হিসাবে কনস্ট্রাক্টর হিসাবে ডাকা হয়। প্রাথমিক ধারণাটি হ'ল এটি একটি বিশেষ পদ্ধতি যা স্বয়ংক্রিয়ভাবে বলা হয় যখন Class শ্রেণীর কোনও বস্তু তৈরি হয়

29

__init__একটি নির্মাণকারীর মত কাজ করে। আপনি যদি কোনও স্থিতিশীল পদ্ধতি হিসাবে আচরণ করতে চান তবে আপনাকে প্রথম আর্গুমেন্ট হিসাবে কোনও শ্রেণির ফাংশনে "স্ব" পাস করতে হবে। "স্ব" আপনার শ্রেণীর জন্য উদাহরণ ভেরিয়েবল।


1
'স্ব' সংজ্ঞায়িত করে যদি কোনও পদ্ধতি স্থির হয় বা না! বাহ, এই জাভা লোকটির জন্য চোখ খোলা।
liwevire

25

এই কোড ব্যবহার করে দেখুন। আশা করি এটি আমার মতো অনেক সি প্রোগ্রামারকে পাই শিখতে সহায়তা করে।

#! /usr/bin/python2

class Person:

    '''Doc - Inside Class '''

    def __init__(self, name):
        '''Doc - __init__ Constructor'''
        self.n_name = name        

    def show(self, n1, n2):
        '''Doc - Inside Show'''
        print self.n_name
        print 'Sum = ', (n1 + n2)

    def __del__(self):
        print 'Destructor Deleting object - ', self.n_name

p=Person('Jay')
p.show(2, 3)
print p.__doc__
print p.__init__.__doc__
print p.show.__doc__

আউটপুট:

Jay

Sum = 5

Doc - Inside Class

Doc - __init__ Constructor

Doc - Inside Show

Destructor Deleting object - Jay


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

আমি ডক জিনিসটি সম্পর্কে পরিষ্কার নই .. এটি কী ডকুমেন্টেশন টানবে? এবং যদি আমি করি: '' 'পরীক্ষা - আমার ডক' '', আমি কি: print.p .__ পরীক্ষা__ ব্যবহার করতে পারি? বা ডক একটি নির্দিষ্ট কীওয়ার্ড?
থমাস

@ থমাস ডক ডকুমেন্টেড বিবরণের জন্য কীওয়ার্ড। দলিল লেখার জন্য ট্রিপল উদ্ধৃতি ব্যবহৃত হয় এবং নথি একটি anচ্ছিক সত্তা।
জয়েজকোড

24

শ্রেণীর অবজেক্ট দুটি ধরণের ক্রিয়াকলাপ সমর্থন করে: গুণাবলী উল্লেখ এবং তাত্ক্ষণিক

অ্যাট্রিবিউট রেফারেন্সগুলি পাইথনের সমস্ত অ্যাট্রিবিউট রেফারেন্সের জন্য ব্যবহৃত স্ট্যান্ডার্ড সিনট্যাক্স ব্যবহার করে: obj.name। শ্রেণীর অবজেক্ট তৈরি হওয়ার সময় বৈধ বৈশিষ্ট্যের নামগুলি সমস্ত নাম যা শ্রেণীর নামস্থানে ছিল in সুতরাং, ক্লাস সংজ্ঞাটি যদি এরকম দেখায়:

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

    def f(self):
        return 'hello world'

তারপরে MyClass.iএবং MyClass.fযথাক্রমে একটি পূর্ণসংখ্যা এবং একটি ফাংশন অবজেক্টটি প্রদান করে বৈধ বৈশিষ্ট্য রেফারেন্স হয়। শ্রেণীর বৈশিষ্ট্যগুলিকেও বরাদ্দ করা যেতে পারে, সুতরাং আপনি MyClass.iকার্য দ্বারা মূল্য পরিবর্তন করতে পারেন । __doc__শ্রেণীর অন্তর্গত ডক্টরসিংকে ফিরিয়ে দেওয়া একটি বৈধ বৈশিষ্ট্যও: "একটি সাধারণ উদাহরণ শ্রেণি"।

ক্লাস ইনস্ট্যান্টেশন ফাংশন স্বরলিপি ব্যবহার করে। কেবল ভান করুন যে ক্লাস অবজেক্টটি প্যারামিটারলেস ফাংশন যা শ্রেণীর একটি নতুন উদাহরণ দেয়। উদাহরণ স্বরূপ:

x = MyClass()

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

def __init__(self):
    self.data = []

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

x = MyClass()

অবশ্যই, __init__()পদ্ধতিটিতে আরও বেশি নমনীয়তার জন্য যুক্তি থাকতে পারে। সেক্ষেত্রে ক্লাস ইনস্ট্যান্টেশন অপারেটরকে দেওয়া যুক্তিগুলি দেওয়া হয় __init__()। উদাহরণ স্বরূপ,

class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart

x = Complex(3.0, -4.5)
x.r, x.i

অফিসিয়াল ডকুমেন্টেশন থেকে নেওয়া হয়েছে যা শেষ পর্যন্ত আমাকে সবচেয়ে বেশি সহায়তা করে।


এখানে আমার উদাহরণ

class Bill():
    def __init__(self,apples,figs,dates):
        self.apples = apples
        self.figs = figs
        self.dates = dates
        self.bill = apples + figs + dates
        print ("Buy",self.apples,"apples", self.figs,"figs 
                and",self.dates,"dates. 
                Total fruitty bill is",self.bill," pieces of fruit :)")

আপনি যখন শ্রেণীর বিলের উদাহরণ তৈরি করেন:

purchase = Bill(5,6,7)

তুমি পাও:

> Buy 5 apples 6 figs and 7 dates. Total fruitty bill is 18  pieces of
> fruit :)

22

এটিকে নিজেই ছাড়িয়ে নিতে সমস্যা হয়েছিল। এমনকি উত্তরগুলি এখানে পড়ার পরেও।

__init__পদ্ধতিটি সঠিকভাবে বুঝতে আপনার নিজের বুঝতে হবে।

স্ব পরামিতি

__init__পদ্ধতি দ্বারা গৃহীত আর্গুমেন্টগুলি হ'ল :

def __init__(self, arg1, arg2):

তবে আমরা কেবল এটি দুটি যুক্তিই পাস করি:

instance = OurClass('arg1', 'arg2')

কোথা থেকে বাড়তি যুক্তি এসেছে?

যখন আমরা কোনও বস্তুর বৈশিষ্ট্য অ্যাক্সেস করি তখন আমরা নাম দ্বারা (বা রেফারেন্স দ্বারা) এটি করি। এখানে উদাহরণটি আমাদের নতুন অবজেক্টের একটি রেফারেন্স। উদাহরণস্বরূপ প্রিন্টার্গস ব্যবহার করে আমরা ইনস্ট্যান্স অবজেক্টের প্রিন্টারেগ পদ্ধতি অ্যাক্সেস করি।

__init__পদ্ধতির মধ্যে থেকে অবজেক্ট বৈশিষ্ট্য অ্যাক্সেস করার জন্য আমাদের অবজেক্টের একটি রেফারেন্স প্রয়োজন।

যখনই কোনও পদ্ধতি ডাকা হয়, মূল ত্রুটির একটি রেফারেন্স প্রথম আর্গুমেন্ট হিসাবে পাস করা হয়। কনভেনশন দ্বারা আপনি সর্বদা আপনার পদ্ধতিগুলির পক্ষে এই প্রথম যুক্তিটি কল করেন।

এর মানে হল যে __init__পদ্ধতিটি আমরা করতে পারি:

self.arg1 = arg1
self.arg2 = arg2

এখানে আমরা অবজেক্টে বৈশিষ্ট্য নির্ধারণ করছি setting আপনি নিম্নলিখিতটি দ্বারা যাচাই করতে পারেন:

instance = OurClass('arg1', 'arg2')
print instance.arg1
arg1

এর মতো মানগুলি অবজেক্ট বৈশিষ্ট্য হিসাবে পরিচিত। এখানে __init__পদ্ধতিটি উদাহরণটির আরগ 1 এবং আরগ 2 বৈশিষ্ট্য নির্ধারণ করে।

উত্স: http://www.voidspace.org.uk/python/articles/OOP.shtml#t--it- ধারণা


17

নোট যে selfআসলে কোন বৈধ পাইথন সনাক্তকারী হতে পারে। উদাহরণস্বরূপ, আমরা ক্রিস বি এর উদাহরণ থেকে ঠিক তত সহজেই লিখতে পারি:

class A(object):
    def __init__(foo):
        foo.x = 'Hello'

    def method_a(bar, foo):
        print bar.x + ' ' + foo

এবং এটি ঠিক একই কাজ করবে। তবে স্ব ব্যবহারের জন্য এটি সুপারিশ করা হয়েছে কারণ অন্যান্য অজগর এটি আরও সহজে চিনতে পারে।


আমি সম্মত হই যে foo এর জায়গায় স্ব প্রস্তাব দেওয়া হবে, কোডটি দেখার জন্য অন্যান্য প্রোগ্রামারদের সহায়তা করে
লিনি

15

মূলত, একই শ্রেণীর মধ্যে একাধিক ফাংশনে ভেরিয়েবল ব্যবহার করার সময় আপনাকে 'স্ব' কীওয়ার্ডটি ব্যবহার করতে হবে। Init হিসাবে , এটি ডিফল্ট মান সেটআপ করতে ব্যবহৃত হয় যখন শ্রেণীর মধ্যে থেকে অন্য কোনও ফাংশন বলা হয় না।


6
পাইথনে কোনও 'স্ব' কীওয়ার্ড নেই। প্রথম প্যারামিটারকে 'স্ব' বলা সহজভাবে একটি সম্মেলন।
ডেভিড অ্যান্ডারসন

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

15
  1. __init__মূলত একটি ফাংশন যা কোনও নির্দিষ্ট অবজেক্টের জন্য শ্রেণীর বৈশিষ্ট্যগুলিকে "আরম্ভ" / "সক্রিয়" করবে, এটি একবার সম্পর্কিত ক্লাসের সাথে তৈরি এবং মিলেছে ..
  2. self object বস্তুর প্রতিনিধিত্ব করে যা এই সম্পত্তিগুলির উত্তরাধিকারী হবে।

1
"স্ব" কীওয়ার্ডটি ব্যবহার করতে হবে না, এটি কেবল স্থানধারক। আপনি যে কোনও শব্দ ব্যবহার করতে পারেন, তবে আপনি সেই প্রোগ্রামটির পঠনযোগ্যতার জন্য স্ব স্ব ব্যবহার করার পরামর্শ দিচ্ছেন
লিনি

13

'স্ব' শ্রেণীর উদাহরণের জন্য একটি উল্লেখ

class foo:
    def bar(self):
            print "hi"

এখন আমরা foo এর উদাহরণ তৈরি করতে পারি এবং এটিতে পদ্ধতিটি কল করতে পারি, এই ক্ষেত্রে পাইথন দ্বারা স্ব পরামিতি যুক্ত করা হয়েছে:

f = foo()
f.bar()

তবে এটি পাশাপাশি পাস করা যেতে পারে যদি পদ্ধতি কলটি ক্লাসের উদাহরণের প্রসঙ্গে না হয় তবে নীচের কোডটি একই কাজ করে

f = foo()
foo.bar(f)

মজার বিষয় হল 'স্ব' পরিবর্তনশীল নামটি কেবল একটি সম্মেলন। নীচের সংজ্ঞাটি হুবহু একই রকম কাজ করবে .. এটা বলা যে এটি অত্যন্ত শক্তিশালী কনভেনশন যা সর্বদা অনুসরণ করা উচিত , তবে এটি ভাষার নমনীয় প্রকৃতি সম্পর্কে কিছু বলে

class foo:
    def bar(s):
            print "hi"

কেন ভাষা নমনীয় প্রকৃতি সম্পর্কে কিছু বলে? এটি কেবলমাত্র বলেছেন যে আপনি ভেরিয়েবলগুলিকে আপনার চয়ন করা কোনও আইনী নাম দিতে পারেন। অন্যান্য প্রোগ্রামিং ভাষার থেকে কীভাবে আলাদা?
ড্যানিয়েল

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

হ্যাঁ এটি ভাষার নমনীয়তা দেখায়। আপনি যেভাবে আপনার উত্তরটি উচ্চারণ করেছেন, দেখে মনে হচ্ছে আপনি বলছেন যে আপনি "স্ব" পরিবর্তনশীলটিকে অন্য কিছু (যেমন s) বলতে পারেন তা অজগরটির নমনীয়তা দেখাচ্ছে।
ড্যানিয়েল

12

প্রশ্নের জন্য একটি ডেমো।

class MyClass:

    def __init__(self):
        print('__init__ is the constructor for a class')

    def __del__(self):
        print('__del__ is the destructor for a class')

    def __enter__(self):
        print('__enter__ is for context manager')
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print('__exit__ is for context manager')

    def greeting(self):
        print('hello python')


if __name__ == '__main__':
    with MyClass() as mycls:
        mycls.greeting()

$ python3 class.objects_instantiation.py
__init__ is the constructor for a class
__enter__ is for context manager
hello python
__exit__ is for context manager
__del__ is the destructor for a class

11

এই কোডে:

class Cat:
    def __init__(self, name):
        self.name = name
    def info(self):
        print 'I am a cat and I am called', self.name

এখানে __init__শ্রেণীর জন্য কনস্ট্রাক্টর হিসাবে কাজ করে এবং যখন কোনও বস্তু তাত্ক্ষণিক হয় তখন এই ফাংশনটি বলা হয়। selfতাত্ক্ষণিক বস্তু প্রতিনিধিত্ব করে।

c = Cat('Kitty')
c.info()

উপরোক্ত বিবৃতিগুলির ফলাফল নিম্নরূপ হবে:

I am a cat and I am called Kitty

11

কী স্ব হবে? এর অর্থ কী ? এটা কি বাধ্যতামূলক ?

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

পাইথন আপনাকে " স্ব " ব্যবহারে জোর করে না । আপনি এটি যে কোনও নাম দিতে পারেন। তবে মনে রাখবেন যে কোনও পদ্ধতির সংজ্ঞায় প্রথম যুক্তিটি হল অবজেক্টের একটি রেফারেন্স । পাইথন আপনার selfপক্ষে তালিকায় যুক্তি যুক্ত করে ; আপনি যখন পদ্ধতিগুলি কল করবেন তখন আপনাকে এটি অন্তর্ভুক্ত করার দরকার নেই। আপনি যদি ডিআইডি পদ্ধতিতে স্ব সরবরাহ না করেন তবে আপনি একটি ত্রুটি পাবেন

TypeError: __init___() takes no arguments (1 given)

Init পদ্ধতিটি কী করে ? কেন এটি প্রয়োজনীয়? (ইত্যাদি)

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


8
# Source: Class and Instance Variables
# https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables

class MyClass(object):
    # class variable
    my_CLS_var = 10

    # sets "init'ial" state to objects/instances, use self argument
    def __init__(self):
        # self usage => instance variable (per object)
        self.my_OBJ_var = 15

        # also possible, class name is used => init class variable
        MyClass.my_CLS_var = 20


def run_example_func():
    # PRINTS    10    (class variable)
    print MyClass.my_CLS_var

    # executes __init__ for obj1 instance
    # NOTE: __init__ changes class variable above
    obj1 = MyClass()

    # PRINTS    15    (instance variable)
    print obj1.my_OBJ_var

    # PRINTS    20    (class variable, changed value)
    print MyClass.my_CLS_var


run_example_func()

5

পাইথন __init__এবং selfতারা কী করে?

কি করে self? এর অর্থ কী? এটা কি বাধ্যতামূলক?

__init__পদ্ধতিটি কী করে ? কেন এটি প্রয়োজনীয়? (ইত্যাদি)

প্রদত্ত উদাহরণটি সঠিক নয়, সুতরাং এর ভিত্তিতে আমাকে একটি সঠিক উদাহরণ তৈরি করতে দিন:

class SomeObject(object):

    def __init__(self, blah):
        self.blah = blah

    def method(self):
        return self.blah 

আমরা যখন বস্তুর উদাহরণ তৈরি করি তখন __init__অবজেক্টটি তৈরি হওয়ার পরে তাকে কাস্টমাইজ করার জন্য ডাকা হয়। অর্থাৎ যখন আমরা কল SomeObjectসঙ্গে 'blah'নিচে (কোন কিছুই হতে পারে যা), এটি পাশ পরার __init__যুক্তি হিসেবে ফাংশন, blah:

an_object = SomeObject('blah')

selfযুক্তির উদাহরণস্বরূপ হয় SomeObjectযে নির্ধারিত হবে an_object

পরে, আমরা এই বস্তুটিতে একটি পদ্ধতি কল করতে চাইতে পারি:

an_object.method()

বিন্দুযুক্ত an_object.methodদৃষ্টিকোণটি করা, অর্থাত্ ফাংশনটির উদাহরণকে আবদ্ধ করে, এবং পদ্ধতিটি (উপরে বলা হিসাবে) এখন একটি "আবদ্ধ" পদ্ধতি - যার অর্থ আমাদের পদ্ধতিটি কলটিতে স্পষ্টভাবে পাস করার দরকার নেই means ।

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

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

__init__পাইথন ডেটামোডেল ডকুমেন্টেশনে নথিভুক্ত একটি বিশেষ পদ্ধতি । উদাহরণটি তৈরি হওয়ার সাথে সাথেই এটি ডাকা হয় (সাধারণত মাধ্যমে __new__- যদিও __new__আপনি অপরিবর্তনীয় ডেটাটাইপ সাবক্লাসিং না করে প্রয়োজন হয় না)।


3

এখানে, লোকটি বেশ ভাল এবং সাধারণ লিখেছেন: https://www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-class-and-object-oriented-programming/

রেফারেন্স হিসাবে উপরের লিঙ্কটি পড়ুন:

self? তাহলে গ্রাহকের সমস্ত পদ্ধতির সেই স্ব প্যারামিটারটি কী? এটা কি? কেন, এটি অবশ্যই, উদাহরণ! আরেকটি উপায় রাখুন, প্রত্যাহারের মতো একটি পদ্ধতি কিছু বিমূর্ত গ্রাহকের অ্যাকাউন্ট থেকে অর্থ প্রত্যাহারের নির্দেশাবলীকে সংজ্ঞায়িত করে। জেফ.উইথড্রে (100.0) কল করা সেই নির্দেশাবলীটি জেফের উদাহরণে ব্যবহারের জন্য রাখে।

সুতরাং যখন আমরা ডিএফ প্রত্যাহার (স্ব, পরিমাণ): বলি, আমরা বলছি, "এখানে আপনি কীভাবে কোনও গ্রাহক বস্তু থেকে অর্থ উত্তোলন করবেন (যা আমরা স্ব স্ব কল করব) এবং একটি ডলার ফিগার (যা আমরা পরিমাণ বলব) self প্রত্যাহারের আহ্বান জানানো হচ্ছে এমন গ্রাহকের উদাহরণ That's এটি আমার সাথে উপমাও বানাচ্ছে না, জেফ.বিথড্রা (১০০.০) কাস্টোমারের সাথে শর্টহ্যান্ড, উইথড্র (জেফ, ১০০.০), যা পুরোপুরি বৈধ (প্রায়শই দেখা না গেলে) কোড।

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

এই জন্যই যখন আমরা কল init , আমরা self.name = নাম ভালো জিনিস বলে বস্তু আরম্ভ। মনে রাখবেন, যেহেতু স্বতঃস্ফূর্ততা, তাই এটি jeff.name = নাম বলা সমান, যা jeff.name = 'জেফ নুপের মতো। একইভাবে, স্ব-ভারসাম্য = ভারসাম্য জেফ.বালেন্স = 1000.0 এর সমান। এই দুটি লাইনের পরে, আমরা গ্রাহক অবজেক্টটিকে "আরম্ভ করা" এবং ব্যবহারের জন্য প্রস্তুত বিবেচনা করি।

আপনি কি সাবধান __init__

আরআইডি শেষ হওয়ার পরে , কলার সঠিকভাবে ধরে নিতে পারেন যে অবজেক্টটি ব্যবহারের জন্য প্রস্তুত। এটি হ'ল জেফ = গ্রাহক ('জেফ নুপ', 1000.0) এর পরে, আমরা জেফের কাছে জমা নেওয়া এবং কল প্রত্যাহার করতে পারি; জেফ পুরোপুরি-আরম্ভীকৃত একটি বস্তু।

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