পাইথন কনস্ট্রাক্টর এবং __init__


107

কেন কনস্ট্রাক্টরকে সত্যই "কনস্ট্রাক্টর" বলা হয়? তাদের উদ্দেশ্য কী এবং কীভাবে তারা ক্লাসে পদ্ধতি থেকে আলাদা?

এছাড়াও, __init__একটি ক্লাসে আরও কি বেশি থাকতে পারে ? আমি নিম্নলিখিত চেষ্টা করেছিলাম, কেউ দয়া করে ফলাফল ব্যাখ্যা করতে পারেন?

>>> class test:
    def __init__(self):
        print "init 1"
    def __init__(self):
        print "init 2"

>>> s=test()
init 2

অবশেষে, __init__একটি অপারেটর ওভারলোডার?


41
প্রযুক্তিগতভাবে, __init__একটি প্রাথমিককরণকারী । পাইথন কনস্ট্রাক্টর হলেন __new__। পাইথন স্বয়ংক্রিয় দ্বি-পর্বের সূচনা ব্যবহার করে - __new__একটি বৈধ তবে (সাধারণত) অব্যবহৃত বস্তু দেয় ( boolএকটি পাল্টা উদাহরণের জন্য দেখুন), যা তারপরে __init__স্বয়ংক্রিয়ভাবে এটিকে ডাকবে। এটি আংশিকভাবে নির্মিত বস্তুর সাথে সি ++ এর মতো ভাষাগুলির সমস্যাগুলি এড়ায় - আপনার পাইথনে কখনও নেই (যদিও এটি আংশিক-প্রাথমিককরণ হতে পারে)। আপনার প্রায়শই কখনও __new__এবং __init__ক্লাসে উভয়ই ওভাররাইড করার প্রয়োজন হবে না ।
টিম ডেলানী 25'12

2
@ টিমডেলানী: আমি নিশ্চিত নই যে আপনি সি ++ তে আংশিকভাবে নির্মিত বস্তুর সাথে কী বোঝাতে চাইছেন।
সেবাস্তিয়ান মাচ

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

@ টিমডেলানী: আহ, স্পষ্ট করে দেওয়ার জন্য ধন্যবাদ।
সেবাস্তিয়ান মাচ

4
@TimDelaney। আমি মনে করি যে আপনার মন্তব্যের গৃহীত উত্তরটি প্রতিস্থাপন করা উচিত।
ফ্ল্যামেনকো

উত্তর:


114

পাইথনে কোনও ফাংশন ওভারলোডিং নেই, মানে একই নামের সাথে আপনি একাধিক ফাংশন রাখতে পারবেন না তবে বিভিন্ন যুক্তি।

আপনার কোড উদাহরণে, আপনি ওভারলোডিং করছেন না __init__()। যা ঘটে তা হ'ল দ্বিতীয় সংজ্ঞাটি নতুন পদ্ধতিতে নামটি পুনরায় প্রত্যাবর্তন করে __init__, প্রথম পদ্ধতিটিকে অ্যাক্সেসযোগ্য nd

কনস্ট্রাক্টর সম্পর্কে আপনার সাধারণ প্রশ্ন হিসাবে, উইকিপিডিয়া একটি ভাল সূচনা পয়েন্ট। পাইথন-নির্দিষ্ট স্টাফগুলির জন্য, আমি পাইথন ডক্সের জন্য অত্যন্ত সুপারিশ করি ।


এর অর্থ কি উত্স ফাইলটি যথাযথভাবে পার্স করা হয়েছে (ব্যাখ্যা করা?)? আমি কি নিশ্চিত হতে পারি যে আমি পরে যা সংখ্যায় সংজ্ঞায়িত করেছি তা একই নামের সাথে সংজ্ঞায়িত ওভাররাইটগুলিকে পূর্বে লিখতে হবে? :( আমার প্রশ্নটি নির্বোধ শোনায় .. এটি জানা উচিত ছিল
0xc0de

4
@ 0xc0de: পাইথনে, ফাংশন সংজ্ঞাগুলি আসলে সম্পাদনযোগ্য বিবৃতি এবং উপরে থেকে নীচে চালিত হয়, তাই হ্যাঁ।
এনপিই

1
@ 0xc0de আসলে যা ঘটে তা হ'ল শ্রেণীর বডিটি তার নিজস্ব নেমস্পেসে মৃত্যুদন্ড কার্যকর করা হয়, সেই নামস্থানটি তখন মেটাক্লাসে (নাম এবং ঘাঁটিগুলির সাথে) পাস করা হয়। ফাংশন সংজ্ঞাগুলি তখন নির্দিষ্ট শরীরের সাথে কেবল একটি ফাংশন তৈরি করে এবং এটির নাম নির্ধারণ করে। __init__ক্লাসে শেষ হওয়া শেষ কাজ হবে।
আকাশ ছোঁয়া

64

কেন কনস্ট্রাক্টরকে সত্যই "কনস্ট্রাক্টর" বলা হয়?

কনস্ট্রাক্টর (নামযুক্ত __new__) শ্রেণীর একটি নতুন উদাহরণ তৈরি করে এবং প্রদান করে। তাই C.__new__বর্গ পদ্ধতি কন্সট্রাকটর বর্গ সি জন্য

C.__init__উদাহরণ হিসেবে বলা যায় পদ্ধতি একটি নির্দিষ্ট উদাহরণস্বরূপ উপর বলা হয়, পরে এটি তৈরি করা হয়, কলার ফিরে প্রেরণ করা হচ্ছে আগেই ইনিশিয়ালাইজ। সুতরাং সেই পদ্ধতিটি সি এর নতুন দৃষ্টান্তের সূচনাকারী is

তারা ক্লাসে পদ্ধতি থেকে কীভাবে আলাদা?

হিসাবে বিবৃত কর্মকর্তা ডকুমেন্টেশন __init__ হয় পরে উদাহরণস্বরূপ তৈরি করা হয় নামক । অন্যান্য পদ্ধতিগুলি এই চিকিত্সা গ্রহণ করে না।

তাদের উদ্দেশ্য কী?

কনস্ট্রাক্টরের উদ্দেশ্যটি C.__new__হ'ল একটি নতুন Cউদাহরণ নির্মাণের সময় কাস্টম আচরণকে সংজ্ঞায়িত করা ।

ইনিশিয়ালাইজারটির উদ্দেশ্য C.__init__হ'ল Cএটি তৈরির পরে প্রতিটি ইভেন্টের কাস্টম আরম্ভের সংজ্ঞা দেওয়া ।

উদাহরণস্বরূপ পাইথন আপনাকে এটি করতে দেয়:

class Test(object):
    pass

t = Test()

t.x = 10   # here you're building your object t
print t.x

তবে আপনি যদি প্রতিটি সংস্করণের জন্য 10 এর সমান Testএকটি গুণাবলী রাখতে চান তবে আপনি xসেই কোডটি ভিতরে রাখতে পারেন __init__:

class Test(object):
    def __init__(self):
        self.x = 10

t = Test()
print t.x

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

ক্লাসের পদ্ধতিগুলি যেমন কনস্ট্রাক্টর __new__পরিবর্তে ক্লাসটি তাদের প্রথম যুক্তি হিসাবে গ্রহণ করে।

এখন, আপনি যদি গুনটির জন্য কাস্টম মান চান তবে আপনাকে যা xকরতে হবে তা হল মানটিকে যুক্তি হিসাবে পাস করা __init__:

class Test(object):
    def __init__(self, x):
        self.x = x

t = Test(10)
print t.x
z = Test(20)
print t.x

আমি আশা করি এটি আপনাকে কিছু সন্দেহ দূর করতে সহায়তা করবে এবং যেহেতু আপনি ইতিমধ্যে অন্যান্য প্রশ্নের ভাল উত্তর পেয়েছেন আমি এখানেই থামব :)


9

ক্লাসগুলি কেবল এখান থেকে অবজেক্ট তৈরি করার জন্য নীলনকাগুলি। কনস্ট্রাক্টর এমন কিছু কোড যা প্রতিবার আপনি কোনও বস্তু তৈরি করার সময় চালিত হয়। এর জন্য এটি দুটি কনস্ট্রাক্টর রয়েছে তা বোঝা যায় না। কি হয় দ্বিতীয় ওভার প্রথম লিখুন।

আপনি সাধারণত এগুলির জন্য যা ব্যবহার করেন তা হ'ল সেই বস্তুর জন্য ভেরিয়েবল তৈরি করা:

>>> class testing:
...     def __init__(self, init_value):
...         self.some_value = init_value

সুতরাং আপনি তখন যা করতে পারেন তা হ'ল এই শ্রেণি থেকে একটি অবজেক্ট তৈরি করা:

>>> testobject = testing(5)

টেস্টোবজেক্টটির পরে একটি অবজেক্ট থাকবে some_valueযা এই নমুনায় 5 হবে।

>>> testobject.some_value
5

তবে আমার প্রতিটি নমুনায় যেমন করেছিলাম তেমন আপনাকে প্রতিটি বস্তুর জন্য একটি মান সেট করার দরকার নেই। আপনি এটির মতোও করতে পারেন:

>>> class testing:
...     def __init__(self):
...         self.some_value = 5

তারপরে কিছু_মূল্যের মান 5 হবে এবং আপনি যখন বস্তুটি তৈরি করবেন তখন আপনাকে এটি সেট করতে হবে না।

>>> testobject = testing()
>>> testobject.some_value
5

>>> এবং ... আমার নমুনায় আপনি যা লিখছেন তা নয়। এটি কীভাবে পাইশেলে দেখবে ...


কোনও সমস্যা নেই, খুশি এটি আপনাকে সাহায্য করেছে :)
নিক্লাস নীলসন

1

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

def func(): #now func refers to an empty funcion
    pass
...
func=5      #now func refers to the number 5
def func():
    print "something"    #now func refers to a different function

আপনার শ্রেণীর সংজ্ঞায় এটি কেবল পরবর্তীটিকে রাখে


0

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

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