__Init__ এর ভিতরে একটি শ্রেণি ফাংশন কল করা


132

আমি এমন কিছু কোড লিখছি যা একটি ফাইল নাম নেয়, ফাইলটি খোলে এবং কিছু ডেটা পার্স করে। আমি এটি একটি ক্লাসে করতে চাই। নিম্নলিখিত কোডটি কাজ করে:

class MyClass():
    def __init__(self, filename):
        self.filename = filename 

        self.stat1 = None
        self.stat2 = None
        self.stat3 = None
        self.stat4 = None
        self.stat5 = None

        def parse_file():
            #do some parsing
            self.stat1 = result_from_parse1
            self.stat2 = result_from_parse2
            self.stat3 = result_from_parse3
            self.stat4 = result_from_parse4
            self.stat5 = result_from_parse5

        parse_file()

তবে এতে __init__আমার ক্লাসের জন্য পার্সিং যন্ত্রপাতি সমস্ত ফাংশনের সুযোগে রেখে দেওয়া জড়িত । এই সরল parse_fileকোডটির জন্য এটি এখন দুর্দান্ত দেখায়, তবে ফাংশনটিতে বেশ কয়েকটি স্তরের রঙও রয়েছে। আমি parse_file()নীচের মতো ক্লাস ফাংশন হিসাবে ফাংশনটি সংজ্ঞায়িত করতে পছন্দ করব :

class MyClass():
    def __init__(self, filename):
        self.filename = filename 

        self.stat1 = None
        self.stat2 = None
        self.stat3 = None
        self.stat4 = None
        self.stat5 = None
        parse_file()

    def parse_file():
        #do some parsing
        self.stat1 = result_from_parse1
        self.stat2 = result_from_parse2
        self.stat3 = result_from_parse3
        self.stat4 = result_from_parse4
        self.stat5 = result_from_parse5

অবশ্যই এই কোডটি কাজ করে না কারণ ফাংশনটি ফাংশনের parse_file()ক্ষেত্রের মধ্যে নেই __init__। Class শ্রেণীর মধ্যে থেকে কোনও শ্রেণি ফাংশন কল করার কোনও উপায় আছে কি __init__? নাকি আমি এই সম্পর্কে ভুলভাবে ভাবছি?


কোড উদাহরণটির জন্য "স্ট্যাট" এর পাঁচটি সংস্করণ প্রয়োজনের কোনও কারণ আছে? এটি পড়তে সহজ করে তোলে যদি সেখানে কেবল একটিই থাকে।
465 বি

উত্তর:


183

ফাংশনটি এইভাবে কল করুন:

self.parse_file()

আপনাকে আপনার পার্সে ফাইল () ফাংশনটি এর মতো সংজ্ঞায়িত করতে হবে:

def parse_file(self):

parse_fileপদ্ধতি এটি আহ্বান উপর একটা অবজেক্ট আবদ্ধ হতে (কারণ এটি একটি স্ট্যাটিক পদ্ধতি নয়) আছে। এটি আপনার ক্ষেত্রে উদাহরণ হিসাবে, অবজেক্টের একটি উদাহরণে ফাংশনটি কল করে এটি করা হয় self


হ্যাঁ! এটি ঠিক আমি যা খুঁজছিলাম ছিল। ধন্যবাদ!
পাইথনজিন

33

আমি যদি ভুল না করি তবে দুটি ফাংশনই আপনার শ্রেণীর অংশ, আপনার এটি ব্যবহার করা উচিত:

class MyClass():
    def __init__(self, filename):
        self.filename = filename 

        self.stat1 = None
        self.stat2 = None
        self.stat3 = None
        self.stat4 = None
        self.stat5 = None
        self.parse_file()

    def parse_file(self):
        #do some parsing
        self.stat1 = result_from_parse1
        self.stat2 = result_from_parse2
        self.stat3 = result_from_parse3
        self.stat4 = result_from_parse4
        self.stat5 = result_from_parse5

আপনার লাইন প্রতিস্থাপন:

parse_file() 

সঙ্গে:

self.parse_file()

আপনি এটি ব্যাখ্যা করতে পারেন কেন এটি অবশ্যই ব্যবহার করা উচিত self.parse_file()এবং কেন নয় parse_file()?
ivanleoncz

@ পারিতোষসিংহকে ফাংশনটির def parse_file(self):আওতায় আটকানো উচিত নয় __init__যাতে আপনার কোনও আংশিক আরম্ভিক অবজেক্ট না থাকে?
ডোনরোডাডন

@ivanleoncz যেমন পার্স_ফায়াল উদাহরণ পদ্ধতি, আমাদের একই কল করতে রেফারেন্স অবজেক্ট ব্যবহার করা উচিত।
পরিতোষ সিং

@ লং যদি এই কোডটি শ্রদ্ধেয় হয় এবং আপনি বাইরে থেকে পার্স ফাইল সেট করার অনুমতি না দিতে চান তবে হ্যাঁ এটি নীস্ট করা উচিত।
পরিতোষ সিং

12

কেমন:

class MyClass(object):
    def __init__(self, filename):
        self.filename = filename 
        self.stats = parse_file(filename)

def parse_file(filename):
    #do some parsing
    return results_from_parse

যাইহোক, যদি আপনি নামে ভেরিয়েবল আছে stat1, stat2ইত্যাদি পরিস্থিতি tuple জন্য ভিক্ষা করছে: stats = (...)

সুতরাং parse_fileএকটি tuple ফিরে আসুন , এবং tuple মধ্যে সংরক্ষণ করুন self.stats

তারপর, উদাহরণস্বরূপ, যদি আপনি অ্যাক্সেস করতে পারবেন তা বলা হত stat3সঙ্গে self.stats[2]


আমি সম্মত হলাম, আমি সেখানে কিছু মাত্রার ভেরিয়েবলগুলি নিযুক্ত করেছিলাম তা দেখানোর জন্য আমি সেখানে self.stat5 এর মাধ্যমে কেবলমাত্র self.stat1 রেখেছি। আসল কোডে আমার আরও মার্জিত সমাধান রয়েছে।
পাইথনজিন

যদি আমি parse_fileফাংশনটি MyClassঅবজেক্টের একটি পদ্ধতি হতে চাই তবে এটি কীভাবে পরিবর্তন করা উচিত । কোথায় selfপ্রয়োজন হবে?
n1k31t4

0

ইন parse_file, selfযুক্তিটি ধরুন (ঠিক তেমন __init__) আপনার যদি অন্য কোনও প্রসঙ্গের প্রয়োজন হয় তবে এটি যথারীতি অতিরিক্ত যুক্তি হিসাবে পাস করুন।


0

আপনাকে অবশ্যই এইভাবে পার্স_ফাইল ঘোষণা করতে হবে; def parse_file(self)। "স্ব" পরামিতি বেশিরভাগ ভাষায় একটি লুকানো প্যারামিটার তবে অজগর নয়। আপনার অবশ্যই এটি অবশ্যই ক্লাসের অন্তর্ভুক্ত সমস্ত পদ্ধতির সংজ্ঞায় যুক্ত করতে হবে। তারপরে আপনি ক্লাসের অভ্যন্তরে যে কোনও পদ্ধতি থেকে ফাংশনটি কল করতে পারেনself.parse_file

আপনার চূড়ান্ত প্রোগ্রামটি এর মতো দেখতে চলেছে:

class MyClass():
  def __init__(self, filename):
      self.filename = filename 

      self.stat1 = None
      self.stat2 = None
      self.stat3 = None
      self.stat4 = None
      self.stat5 = None
      self.parse_file()

  def parse_file(self):
      #do some parsing
      self.stat1 = result_from_parse1
      self.stat2 = result_from_parse2
      self.stat3 = result_from_parse3
      self.stat4 = result_from_parse4
      self.stat5 = result_from_parse5

-13

আমি মনে করি যে আপনার সমস্যা সঠিকভাবে ইন্ডেন্ট করেও না দিয়ে আসলে Init function.It এরকম হওয়া উচিত

class MyClass():
     def __init__(self, filename):
          pass

     def parse_file():
          pass

আপনার কোডও নয়। যদি না আপনি @staticmethodparse_file
ডেকরেটারটির

অন্তত selfআপনার parse_fileপদ্ধতিতে অনুপস্থিত যোগ করুন ।
রেন্টানপ্ল্যান

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