เรียกใช้ฟังก์ชันคลาสภายใน __init__


133

ฉันกำลังเขียนโค้ดที่ใช้ชื่อไฟล์เปิดไฟล์และแยกวิเคราะห์ข้อมูลบางอย่าง ฉันต้องการทำสิ่งนี้ในชั้นเรียน รหัสต่อไปนี้ใช้งานได้:

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__ฟังก์ชัน มีวิธีเรียกฟังก์ชันคลาสจากภายใน__init__คลาสนั้นหรือไม่? หรือฉันคิดเรื่องนี้ผิดทาง?


มีเหตุผลใดบ้างที่ตัวอย่างโค้ดต้องการ "stat" ห้าเวอร์ชัน มันจะช่วยให้อ่านง่ายขึ้นถ้ามีเพียงอันเดียว
465b

คำตอบ:


185

เรียกใช้ฟังก์ชันด้วยวิธีนี้:

self.parse_file()

คุณต้องกำหนดฟังก์ชัน parse_file () ของคุณเช่นนี้:

def parse_file(self):

parse_fileวิธีการจะต้องมีการผูกไว้กับวัตถุเมื่อเรียกมัน (เพราะมันไม่ได้เป็นวิธีการคงที่) selfนี้จะกระทำโดยการเรียกฟังก์ชั่นในตัวอย่างของวัตถุทั้งในกรณีของคุณอินสแตนซ์


ใช่ นี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณ!
PythonJin

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

@paritoshsingh def parse_file(self):ไม่ควรซ้อนอยู่ภายใต้__init__ฟังก์ชันเพื่อที่คุณจะได้ไม่มีวัตถุเริ่มต้นบางส่วน?
donrondadon

@ivanleoncz เนื่องจาก parse_file เป็นวิธีการอินสแตนซ์เราจึงต้องใช้วัตถุอ้างอิงเพื่อเรียกสิ่งเดียวกัน
Paritosh Singh

@rong หากรหัสนี้เป็นที่เคารพนับถือและคุณไม่ต้องการอนุญาตให้ตั้งค่าไฟล์แยกวิเคราะห์จากภายนอกใช่ควรซ้อนกัน
Paritosh Singh

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คืนทูเพิลและเก็บทูเพิล self.statsไว้

แล้วสำหรับตัวอย่างเช่นคุณสามารถเข้าถึงสิ่งที่เคยถูกเรียกว่ามีstat3self.stats[2]


ฉันเห็นด้วยฉันใส่ self.stat1 ผ่าน self.stat5 ในนั้นเพื่อแสดงว่ามีตัวแปรคลาสบางตัวที่ฉันกำหนดให้ ในรหัสจริงฉันมีโซลูชันที่หรูหรากว่านี้
PythonJin

สิ่งนี้ควรแก้ไขอย่างไรถ้าฉันต้องการให้parse_fileฟังก์ชันเป็นวิธีการของMyClassวัตถุ ที่ไหนจะselfจำเป็น?
n1k31t4

0

ในparse_fileใช้selfอาร์กิวเมนต์ (เช่นเดียวกับใน__init__) หากมีบริบทอื่นที่คุณต้องการให้ส่งต่อเป็นอาร์กิวเมนต์เพิ่มเติมตามปกติ


0

คุณต้องประกาศ parse_file เช่นนี้ def parse_file(self). พารามิเตอร์ "self" เป็นพารามิเตอร์ที่ซ่อนอยู่ในภาษาส่วนใหญ่ แต่ไม่ใช่ใน python คุณต้องเพิ่มเข้าไปในนิยามของวิธีการทั้งหมดที่เป็นของคลาส จากนั้นคุณสามารถเรียกใช้ฟังก์ชันจากวิธีการใดก็ได้ในคลาสโดยใช้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ไม่ถูกต้องควรเป็นเช่นนี้

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

     def parse_file():
          pass

ไม่ใช่รหัสของคุณ เว้นแต่คุณจะวาง@staticmethodมัณฑนากรไว้ด้านบน parse_file
rantanplan

อย่างน้อยเพิ่มสิ่งที่ขาดหายไปselfในparse_fileวิธีการของคุณ
rantanplan

อ๊ะขออภัยควรมีการเยื้องเลเยอร์พิเศษภายใต้บรรทัด "คลาส MyClass ():" ฉันได้แก้ไขไปแล้ว แต่คำถามยังคงเหมือนเดิม
PythonJin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.