পাইথনে উত্তরাধিকার এবং সূচনা পদ্ধতি


94

আমি অজগরটির প্রবীন। আমি উত্তরাধিকার বুঝতে পারি না এবং __init__()

class Num:
    def __init__(self,num):
        self.n1 = num

class Num2(Num):
    def show(self):
        print self.n1

mynumber = Num2(8)
mynumber.show()

ফলাফল: 8

এটা ঠিক আছে. কিন্তু আমি প্রতিস্থাপন Num2সঙ্গে

class Num2(Num):
    def __init__(self,num):
        self.n2 = num*2
    def show(self):
        print self.n1,self.n2

ফলাফল: Error. Num2 has no attribute "n1".

এই ক্ষেত্রে, Num2অ্যাক্সেস করতে পারেন কিভাবে n1?

উত্তর:


148

প্রথম অবস্থায় Num2বর্গ ব্যাপ্ত হয় Numএবং আপনি যেহেতু redefining নেই বিশেষ পদ্ধতি নামে __init__()Num2, তা থেকে উত্তরাধিকারসূত্রে পরার Num

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

দ্বিতীয় অবস্থায় যেহেতু আপনি redefining হয় __init__()মধ্যে Num2আপনি স্পষ্টভাবে সুপার শ্রেণী (এক ফোন করতে হবে Num) যদি আপনি তার আচরণ বাড়াতে চাই।

class Num2(Num):
    def __init__(self,num):
        Num.__init__(self,num)
        self.n2 = num*2

23
আপনার উত্সাহটি ব্যাখ্যা করার জন্য পর্যাপ্ত নয় কেন, যখন __init__কোনও উত্পন্ন শ্রেণিতে কোনও পদ্ধতির সংজ্ঞা দেওয়া হয় না , এটি উত্তরাধিকার সূত্রে প্রাপ্ত হয়। কারণ "যদি অনুরোধকৃত বৈশিষ্ট্যটি শ্রেণিতে না পাওয়া যায় তবে সন্ধানটি বেস শ্রেণিতে সন্ধান করতে এগিয়ে যায়।" (ডক)
আইকন

4
আমি দুঃখিত ... এটি মূলত উত্তরাধিকার কীভাবে কাজ করে ... আপনি যদি কোনও শ্রেণীর উত্তরাধিকারী হন তবে আপনি পুরো প্যাকেজটি পান, সুতরাং, সুপারক্লাসের সমস্ত জিনিস সাবক্লাসে বিদ্যমান। তবে, আপনি যদি কোনও পদ্ধতির পুনরায় সংজ্ঞা দেন তবে তা ওভাররেড হয়ে যায় ... যা আপনার কোডে রয়েছে।
কোয়া

4
@ মারিও-ডুয়ার্টে কোনও কারণেই কেন এর চেয়ে ভাল হবে super(Num2, self).__init__(num)?
সাহসী

4
আমি এই উত্তরটিতে প্রস্তাবিত সমাধানটি ব্যবহারের পরিবর্তে স্যুইচ করেছি superএবং আমার প্রোগ্রামটি এখন কয়েক সেকেন্ডে দ্রুত লোড হয়। কেন জানি না।
গুইমোট

superএকাধিক উত্তরাধিকার ব্যবহার করার সময় সহায়ক বলে মনে করা হয়। একক উত্তরাধিকারের জন্য এর সুবিধাগুলি সুস্পষ্ট নয়।
জোহান বিজে



3

নুম 2 শ্রেণিতে এর মতো একটি সাধারণ পরিবর্তন:

super().__init__(num) 

এটি পাইথন 3 এ কাজ করে।

class Num:
        def __init__(self,num):
                self.n1 = num

class Num2(Num):
        def __init__(self,num):
                super().__init__(num)
                self.n2 = num*2
        def show(self):
                print (self.n1,self.n2)

mynumber = Num2(8)
mynumber.show()

4
এই কারণেই আমি স্ট্যাকওভারফ্লো পছন্দ করি। যদিও এটি প্রশ্নের উত্তর না হলেও এটি সহায়ক। কখনও কখনও লোকেরা যে উত্তরগুলি পোস্ট করে সেগুলি সেই প্রশ্নের উত্তর যা মানুষের জিজ্ঞাসা করা উচিত ছিল। ধন্যবাদ!
গ্লেন থম্পসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.