Python 如何在子类中使用父类的属性?
我是Python中OOP的初学者。这是我的代码块Python 如何在子类中使用父类的属性?,python,class,oop,parent-child,Python,Class,Oop,Parent Child,我是Python中OOP的初学者。这是我的代码块 #%% IMPORTING MODULES import numpy as np import netCDF4 as nc4 import datetime as dt #%% RAINFALL CLASS class Rainfall(): date_zero = dt.date(1901,1,1) #Initialise the class attributes def __init__(self,path):
#%% IMPORTING MODULES
import numpy as np
import netCDF4 as nc4
import datetime as dt
#%% RAINFALL CLASS
class Rainfall():
date_zero = dt.date(1901,1,1)
#Initialise the class attributes
def __init__(self,path):
self.path = path
self.dataset = nc4.Dataset(self.path, mode='r')
self.lon = self.dataset.variables['LON'][:]
self.lat = self.dataset.variables['LAT'][:]
self.time = self.dataset.variables['TIME'][:]
# self.rf = self.dataset.variables['RAIN'][:]
self.date = np.arange(dt.datetime(1979,1,1), dt.datetime(2019,1,1), dt.timedelta(days=1)).astype(dt.datetime)
self.index_jjas = []
for i,val in enumerate(self.date):
if val.month >= 6 and val.month<=9:
self.index_jjas.append(i)
self.jjas_rf = self.dataset.variables['RAIN'][self.index_jjas]
self.nonzero = self.nonzero_jjas()
self.sorted_rf = self.sorted_list(self.nonzero)
self.threshold = self.p95(self.sorted_rf)
self.val_abv_threshold = np.ma.masked_less(self.nonzero, self.threshold)
self.abv_threshold = np.ma.MaskedArray.count(self.val_abv_threshold, axis=0)
self.clim = self.simpleprob(self.abv_threshold, len(self.index_jjas))
#Method to find the non zero precipitation
def nonzero_jjas(self):
return np.ma.masked_less(self.jjas_rf, 0.2)
#Method to sort the non zero precipitation array
def sorted_list(self, nz):
return np.ma.MaskedArray.filled(np.ma.sort(nz, axis=0), np.nan)
#Method to obtain the 95th percentile for threshold value to identify extremes
def p95(self,ns):
return np.nanpercentile(ns, 95, axis=0)
#Method to obtain the probabiltiy
def simpleprob(self, a1, a2):
return np.divide(a1, a2)
#Method to identify ExtremeDays in Waves
def extr(self, a1, a2, data, clim):
m1 = a1.mask
m2 = a2.mask
m3 = m1 | m2
count = np.ma.MaskedArray.count(a2, axis=0)
data_new = np.ma.masked_where(m3, data)
data_count = np.ma.MaskedArray.count(data_new, axis=0)
data_prob = np.divide(data_count, count)
prob_diff = data_prob - clim
return (data_new, data_count, data_prob, prob_diff)
#%% Waves Class
class Waves(Rainfall):
#Initialise the class attributes
def __init__(self, path1, path2):
self.olr_path = path1
self.mvr_path = path2
self.olr_dataset = nc4.Dataset(self.olr_path, mode='r')
self.mvr_dataset = nc4.Dataset(self.mvr_path, mode='r')
self.date = np.arange(dt.datetime(1979,1,1), dt.datetime(2019,1,1), dt.timedelta(days=1)).astype(dt.datetime)
self.index_jjas = []
for i,val in enumerate(self.date):
if val.month >= 6 and val.month<=9:
self.index_jjas.append(i)
self.olr = self.olr_dataset.variables['olr'][self.index_jjas]
self.mvr = self.mvr_dataset.variables['var'][self.index_jjas]
self.mn_mvr = np.nanmean(self.mvr, axis=0)
self.std_olr = np.nanstd(self.olr, axis=0)
self.active = self.active_days()
self.dry = self.dry_days(self.active)
self.wet = self.wet_days(self.active)
self.ext_dry = self.extr(self.val_abv_threshold, self.dry, self.olr, self.clim)
self.ext_wet = self.extr(self.val_abv_threshold, self.wet, self.olr, self.clim)
#Method to find the active days
def active_days(self):
return np.ma.masked_where(np.ma.getmask(np.ma.masked_less(self.mvr, self.mn_mvr)), self.olr)
#Method to find the dry days
def dry_days(self, act1):
return np.ma.masked_less_equal(act1, (0.5*self.std_olr))
#Method to find the wet days
def wet_days(self, act1):
return np.ma.masked_greater_equal(act1, (-0.5*self.std_olr))
#%% Create Objects and other attributes
rain = Rainfall(path='rf_1979_2018.nc')
mjo = Waves(path1='/home/anik3t/Documents/Data/olr/0.25degfiles/mjo_final.nc', path2= '/home/anik3t/Documents/Data/olr/mjo_var.nc')
#%%导入模块
将numpy作为np导入
将netCDF4导入为nc4
将日期时间导入为dt
#%%降雨等级
类():
日期=日期(1901,1,1)
#初始化类属性
定义初始化(自身,路径):
self.path=path
self.dataset=nc4.dataset(self.path,mode='r')
self.lon=self.dataset.variables['lon'][:]
self.lat=self.dataset.variables['lat'][:]
self.time=self.dataset.variables['time'][:]
#self.rf=self.dataset.variables['RAIN'][:]
self.date=np.arange(dt.datetime(1979,1,1)、dt.datetime(2019,1,1)、dt.timedelta(days=1)).astype(dt.datetime)
self.index_jjas=[]
对于i,枚举中的val(自我日期):
如果val.month>=6且val.month=6且val.month您需要呼叫:
super()
从Waves
类的构造函数调用其父类的构造函数。否则该代码将不会执行。当您有一个子类时,您必须在子类的\uuuu init\uuuu
方法内创建父类对象。在代码中,父类\uuuu init\uuu
方法需要一个参数(path)
,在创建父对象时应传递该参数。可以通过添加以下行来执行此操作:
super().__init__(path)
此处的路径与创建对应于Wave
rain = Rainfall(path=some_path)
如果Rainsion和Wave完全不同,并且它们不共享属性path
,那么您可以使用以下两个子类来遵循另一个选项:
Class Parent:
def __init__(self):
## define your parent class attributes
def Method1(self, args):
## define your parent class method
def Method2(self, args):
## define your parent class method
Class Child1:
def __init__(self):
super().__init__()
## define your parent class attributes
def Method3(self, args):
## define your parent class method
def Method4(self, args):
## define your parent class method
Class Child2:
def __init__(self):
super().__init__()
## define your parent class attributes
def Method3(self, args):
## define your parent class method
def Method4(self, args):
## define your parent class method
这样,您的child1
类可以是rainment
,而Child2
可以是Wave
,所有共享属性和方法都将在Parent
类中。您需要在子类中调用super:super()。\uu init_uuuu(路径1)为什么Waves
是rainment
的子类?鉴于您在任何方法中很少使用self
,您是否需要任何类都是有争议的。@nickthefreak但path1是我的wave文件的路径。@chepner我创建了子类,因为我认为这样做可以使用父类的属性。这是否需要是我创建rain对象时提供的文件的路径?
Class Parent:
def __init__(self):
## define your parent class attributes
def Method1(self, args):
## define your parent class method
def Method2(self, args):
## define your parent class method
Class Child1:
def __init__(self):
super().__init__()
## define your parent class attributes
def Method3(self, args):
## define your parent class method
def Method4(self, args):
## define your parent class method
Class Child2:
def __init__(self):
super().__init__()
## define your parent class attributes
def Method3(self, args):
## define your parent class method
def Method4(self, args):
## define your parent class method