python - 继承的类无法访问 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_n
and self.numerical_value_counts_n
,那很好。如果我将这些属性从父类中删除到全局变量中,也可以。
如何使它们成为父类的属性,并在子类的当前意图中使用它?
解决方案
推荐阅读
- react-native - React Native(Expo)导航配置无法正确解析到正确的路线
- object - 错误代码:-2147024809 (80070057)“找不到特定对象”
- ssl - 下载文件时 SSL3 解密失败,但只能通过以太网而不是同一路由器的 Wi-Fi
- git - Gitlab工件在分支之间传递
- angular - 使用 Angular Material Dialog 滚动到对话框顶部
- r - 为什么我的 csv 从 R 导出到 Excel 会在单个单元格中显示一行中的所有内容?
- r - 从 Reddit 抓取,参数的列数不匹配
- winapi - 如何为资源加载 16 位可执行文件 (NE)?
- huawei-mobile-services - 如何在没有谷歌的情况下快速获取 GPS 位置更新 fusedLocationClient
- javascript - 如何从 React 网站计算用户的 CPU 使用百分比?