Дочерний класс обращается к атрибуту родительского класса с супер без повторения аргументов - PullRequest
0 голосов
/ 10 мая 2019

Я хочу получить доступ к родительским атрибутам из дочернего класса без необходимости постоянно повторять super().__init__ аргументы

Я пробовал без супер, я пробовал super().attribute, я пытался установить значение по умолчанию в родительском классе или дочернем классе

Допустим, у меня следующая ситуация:

class GM2_setup_to_convert:

    #Class to define which file to convert
    def __init__(self, file_name, path_to_folder):
        self.file_name = file_name
        self.path_to_folder = path_to_folder
        self.file_to_convert = self.path_to_folder + self.file_name

Тогда у меня есть несколько дочерних классов, таких как:

class Hardware_sheet(GM2_setup_to_convert):

    #Class to define hardware_sheet of file to convert
    def __init__(self, file_name, path_to_folder):
        super().__init__(file_name, path_to_folder)

        self.spec_excl_file_hardware = pd.read_excel(self.file_to_convert, sheet_name=' Hardware ', header=None)

class Expressions_cal(GM2_setup_to_convert):

    def __init__(self,file_name, path_to_folder):
        super().__init__(file_name, path_to_folder)

        self.spec_excl_file_cal_expr = pd.read_excel(self.file_to_convert, sheet_name=' Expression Calculation ', header=None, skiprows=[0, 1])

и так далее. Теперь, если я хочу создать экземпляр экземпляра дочерних классов, есть ли способ избежать необходимости записывать аргументы super (). init (file_name, path_to_folder) (см. Ниже) для каждого экземпляра?

expr = Expressions_cal(file_name, path_to_folder)

например. как:

class GM2_setup_to_convert:

    #Class to define which file to convert
    def __init__(self, file_name=default, path_to_folder=default):
        self.file_name = file_name
        self.path_to_folder = path_to_folder
        self.file_to_convert = self.path_to_folder + self.file_name

или

class Expressions_cal(GM2_setup_to_convert):

    def __init__(self,file_name=default, path_to_folder=default):
        super().__init__(file_name, path_to_folder)

        self.spec_excl_file_cal_expr = pd.read_excel(self.file_to_convert, sheet_name=' Expression Calculation ', header=None, skiprows=[0, 1])

1 Ответ

0 голосов
/ 10 мая 2019

Прежде всего, я бы порекомендовал вам использовать полный путь в качестве параметра. Затем, если вы хотите разделить его, вы можете использовать, например, path, file_name = os.path.split() или как показано ниже:

import os
class GM2_setup_to_convert:

    def __init__(self, path="default_path"):
        self.file_name = os.path.basename(path)
        self.path_to_folder = os.path.dirname(path)
        self.file_to_convert = path


class Expressions_cal(GM2_setup_to_convert):

    def __init__(self, path=None):
        if path:
            super().__init__(path)
        else:
            super().__init__()  # In this case defaul value from class above will be taken.

        self.spec_excl_file_cal_expr = pd.read_excel(self.file_to_convert, sheet_name=' Expression Calculation ', header=None, skiprows=[0, 1])

Теперь у вас есть 2 способа создать Expressions_cal объект.

obj1 = Expressions_cal('new_path_to_file')  # pass 'new_path_to_file' as parameter
obj2 = Expressions_cal()  # takes defaul parameter ('default_path') from parent class
...