【问题标题】:Writing Base class using object oriented programming使用面向对象编程编写基类
【发布时间】:2022-01-11 19:40:39
【问题描述】:

Link for my initial part of this question

我是面向对象编程的新手,我需要使用下面给出的类图在下面的代码中编写一个 BankDataWriterBase 基类。我无法理解类图所具有的完整内容,这里有任何人知道并向我解释他们使用类图实际在说什么

在我理解之后,我这样做了: 我知道我的方法是错误的,但我不知道错误发生在哪里

import pandas as pd

class ExcelParser:
    def __init__(self):
        self.config = []       
    
    def extract(self, file_name):
        raw_excel=pd.read_excel(file_name,sheet_name=None, na_values= None, keep_default_na=False)
        return [x for k, v in raw_excel.items() for x in v[v.columns.intersection(conf)].to_dict(orient='records')]

class BankDataWriterBase:
    def __init__(self):
        self.input_path = file_name
        self.output_path = out_path
        self.bank_identifier = bank_id
    
    def write_file(self, file_name):
        res = True
        return res

if __name__ == "__main__":
    conf = list(input("ENTER THE LIST HERE : ").split(','))
    file_name = input("Enter the full input path here : ")
    out_path = input("Enter the full path for the output : ")
    bank_id = input("Enter the Bank ID : ")
    obj = ExcelParser()
    obj.config = conf
    print(obj.extract(file_name))
    
    obj1 = BankDataWriterBase()
    obj1.output_path =  out_path
    obj1.bank_identifier = bank_id    
    print(obj1.write_file(file_name))
    

看到一些答案后,我改变了我的代码,如下所示

import pandas as pd

class ExcelParser:
    def __init__(self):
        self.config = []       
    
    def extract(self, file_name):
        raw_excel=pd.read_excel(file_name,sheet_name=None, na_values= None, keep_default_na=False)
        return [x for k, v in raw_excel.items() for x in v[v.columns.intersection(conf)].to_dict(orient='records')]

class BankDataWriterBase:
    def __init__(self,file_name,out_path,bank_id):
        self.input_path = file_name
        self.output_path = out_path
        self.bank_identifier = bank_id
    
    def write_file(self, file_name:str):
        res = True
        return res
    
class BankDataWriterImpl(BankDataWriterBase):
    def __init__(self, file_name, out_path, bank_id):
        super().__init__(file_name, out_path, bank_id)
    
    def extrac_json(self, file_name):
        pass

if __name__ == "__main__":
    conf = list(input("ENTER THE LIST HERE : ").split(','))
    file_name = input("Enter the full input path here : ")
    out_path = input("Enter the full path for the output : ")
    bank_id = input("Enter the Bank ID : ")
    obj = ExcelParser()
    obj.config = conf
    print(obj.extract(file_name))
    
    obj1 = BankDataWriterBase()
    obj1.output_path =  out_path
    obj1.bank_identifier = bank_id    
    print(obj1.write_file(file_name))
    

【问题讨论】:

    标签: python class oop inheritance object-oriented-analysis


    【解决方案1】:

    他们的意思是BankDataWriterImpl 应该像这样从BankDataWriterBase 继承:

    class BankDataWriterBase():
        ...
    
    class BankDataWriterImpl(BankDataWriterBase):
        # this class inherit from parent class BankDataWriterBase
        # when a `BankDataWriterBase` object is created, parent.__init__ method is executed.
        def extract_jon(self, filename: str):
            pass
    

    然后在驱动程序代码中,您可以创建一个BankDataWriterImpl() 对象,而不是像之前那样创建BankDataWriterBase()

    它将从父级继承其__init__ 方法并拥有一个新的extract_json 方法。

    你没有提到的另一个问题来自BankDataWriterBase 属性。您的代码假定存在 3 个全局变量。 当您创建对象时,它们应该传递给类,如下所示:

    但在创建 BankSomething 对象时要小心,因为现在需要这些参数:

    class BankDataWriterBase:
         def __init__(self, input_path, output_path, bank_identifier):
            self.input_path = input_path
            self.output_path = output_path
            self.bank_identifier = bank_identifier
    
    ...
    
    obj1 = BankDataWriterImpl(input_path, output_path, bank_identifier)
    

    评论后编辑:但我的领导说只为BankDataWriterBase()写课程

    class BankDataWriterBase:
         def __init__(self, input_path, output_path, bank_identifier):
            self.input_path = input_path
            self.output_path = output_path
            self.bank_identifier = bank_identifier
    
    ...
    
    def write_file(file_name: str):
        pass
    
    obj = BankDataWriterBase(input_path, output_path, bank_identifier)
    # setattr add a new attribute to `obj`, first argument is the object,
    # second argument its name (obj.name)
    # third argument the attribute itself
    # here we attach a new method `obj.write_file` to the object
    setattr(obj, 'write_file', write_file)
    
    # now you can use it like that :
    # this line would have raised an exception before the `setattr` line
    obj.write_file("correct_file_path")
    

    【讨论】:

    • 但我的领导说只为BankDataWriterBase() 写课程,为什么??..这可能吗??
    • 您可以将settattr 与我猜的功能一起使用。这很奇怪:)
    • 我将编辑我的答案以反映此评论。请更新您的问题,因为它没有指定。
    • 你想要这个问题的什么细节??
    • 正是你刚才所说的,“只为BankDataWriterBase()编写课程。我上次的编辑就是这样做的。正如我所说,这很奇怪,因为它看起来不像setattr的简单演示...
    【解决方案2】:

    没有实现的结构:

    class Task:
        def __init__(self): # initialise all the instance variables (None in this case)
            pass # this this might need to be empty
        def run(self) -> None:
            pass
    
    class BankDataWriterBase:
        def __init__(self, file_name: str, out_path: str, bank_id: str): 
        # you might wan't to set default values: file_name: str = "" for example
            self.input_path = file_name
            self.output_path = out_path
            self.bank_identifier = bank_id
        
        def write_file(self, file_name) -> str:
            pass
    
    class BankDataWriterImpl(BankDataWriterBase): 
    # inherit from BankDataWriterBase, all functions and variables from BankDataWriterBase are now callable from this class
        # as said in the other answer, this will be inherited so you don't need to have this
        def __init__(self, file_name: str, out_path: str, bank_id: str):
            super().__init__(file_name, out_path, bank_id) # call __init__ method of all the superclasses (in this case only BankDataWriterBase)
    
        def extract_json(self, filename: str):
            pass
    

    【讨论】:

      猜你喜欢
      • 2013-10-25
      • 1970-01-01
      • 2020-05-18
      • 2019-02-25
      • 2010-09-18
      • 2022-10-05
      • 2015-03-20
      • 1970-01-01
      • 2012-03-03
      相关资源
      最近更新 更多