首页 > 解决方案 > 继承的类无法访问 Python 中父类的修饰函数的属性

问题描述

我有一个带有装饰功能的父类。

import pandas as pd
import ctypes
import sec1_data_preparation as data_prep
import sec2_prepped_data_import as prepped_data_import

# Main class
######################################################################
class Analysis_ProjectX(data_prep.DataPreparation_ProjectX):
    def __init__(self):
        super()
        # Working/processed df; can overwrite
        self.df_dad_processed = None
        self.df_pc_processed = None
        self.df_nacrs_processed = None
        self.df_pin_processed = None
        self.df_reg_processed = None
        # Subject group holder
        self.df_master_filtered = None
        # Display parameters
        self.numerical_value_counts_n = 5
        self.categorical_value_counts_n = 5

    # Decorator function
    def result_decor(func):
        def print_result(self, df_key, df, var_name):
            print ('/////////////////////////////////////////')
            print ('/////////////////////////////////////////')
            func(self, df_key, df, var_name)
            print ('/////////////////////////////////////////')
            print ('/////////////////////////////////////////'+'\n')
        return print_result

    @result_decor
    def descriptive_num_var_results(self, df_key, df, var_name):
        print ('Dataset name: {}'.format(df_key))
        print ('{}, mean: {}'.format(var_name, df[var_name].mean()))
        print ('{}, std: {}'.format(var_name, df[var_name].std()))
        print ('{}, min: {}'.format(var_name, df[var_name].min()))
        print ('{}, max: {}'.format(var_name, df[var_name].max()))
        print ('{}, percentiles:\n{}'.format(var_name, str(df[var_name].quantile([.25, .5, .75]))))
        print ('{}, value counts:\n{}'.format(var_name, str(df[var_name].value_counts().head(self.numerical_value_counts_n))))

    @result_decor
    def descriptive_cat_var_results(self, df_key, df, var_name):
        print ('Dataset name: {}'.format(df_key))
        print ('{}, value counts (n):\n{}'.format(
            var_name, 
            str(df[var_name].value_counts().sort_index().head(self.categorical_value_counts_n)),
            ))
        print ('{}, value counts (%):\n{}'.format(
            var_name, 
            str(df[var_name].value_counts().sort_index().head(self.categorical_value_counts_n)*100/len(df)),
            ))

这是继承的类

import pandas as pd
import ctypes
import sec1_data_preparation as data_prep
import sec2_prepped_data_import as prepped_data_import
import sec4_analysis as analysis

# Main class
######################################################################
class Analysis_ProjectX_Demographic(analysis.Analysis_ProjectX):
    def __init__(self):
        super()

    def demographic_analytic_steps(self):
        self.import_parent_ref_data()
        self.import_master_data()
        self.recategorize_var()
        self.show_result()

    def recategorize_var(self):
        self.df_master_filtered = self.recat_binary(self.df_master_filtered, 'INDEX_RURAL', 'INDEX_RURAL_CAT', 0, 'URBAN', 1, 'RURAL')
        self.df_master_filtered = self.recat_age(self.df_master_filtered, 'INDEX_AGE', 'INDEX_AGE_CAT')

    def show_result(self):
        df_dict = {
            'TxGroup':self.df_master_filtered, 
            }
        for df_key, df in df_dict.items():
            print ('Dataset name: {}'.format(df_key))
            print ('Unique patients, n: {}'.format(df['PHN_ENC'].nunique()))
            self.descriptive_num_var_results(df_key, df, 'INDEX_AGE')
            self.descriptive_cat_var_results(df_key, df, 'INDEX_AGE_CAT')
            self.descriptive_cat_var_results(df_key, df, 'INDEX_RURAL_CAT')
            self.descriptive_cat_var_results(df_key, df, 'INDEX_SEX')

    # Helper functions
    def recat_binary(self, df, old_var, new_var, old_val1, new_val1, old_val2, new_val2):
        df.loc[df[old_var] == old_val1, new_var] = new_val1 
        df.loc[df[old_var] == old_val2, new_var] = new_val2 
        return df

    def recat_age(self, df, old_var, new_var):
        df.loc[(df[old_var]>=19.00)&(df[old_var]<25.00), new_var] = '19-24'
        df.loc[(df[old_var]>=25.00)&(df[old_var]<30.00), new_var] = '25-29'
        df.loc[(df[old_var]>=30.00)&(df[old_var]<35.00), new_var] = '30-34'
        df.loc[(df[old_var]>=35.00)&(df[old_var]<40.00), new_var] = '35-39'
        df.loc[(df[old_var]>=40.00)&(df[old_var]<45.00), new_var] = '40-44'
        df.loc[(df[old_var]>=45.00)&(df[old_var]<50.00), new_var] = '45-49'
        df.loc[(df[old_var]>=50.00)&(df[old_var]<55.00), new_var] = '50-54'
        df.loc[(df[old_var]>=55.00)&(df[old_var]<60.00), new_var] = '55-59'
        df.loc[(df[old_var]>=60.00)&(df[old_var]<65.00), new_var] = '60-64'
        df.loc[(df[old_var]>=65.00)&(df[old_var]<300.00), new_var] = '65/above'
        return df

x = Analysis_ProjectX_Demographic()
x.demographic_analytic_steps()
print(len(x.df_master_filtered))
print(x.df_master_filtered.head())

self.show_result()错误在函数处如下

descriptive_num_var_results
print ('{}, value counts:\n{}'.format(var_name, str(df[var_name].value_counts().head(self.numerical_value_counts_n))))
AttributeError: 'Analysis_Jahip_Demographic' object has no attribute 'numerical_value_counts_n'

如果我在子类中声明self.numerical_value_counts_nand self.numerical_value_counts_n,那很好。如果我将这些属性从父类中删除到全局变量中,也可以。

如何使它们成为父类的属性,并在子类的当前意图中使用它?

标签: pythonpython-3.xclassinheritancedecorator

解决方案


推荐阅读