在 Python 中创建 Class 个列表
Create Class of Lists in Python
我必须从一堆 XML 文件中提取患者信息以进行进一步的数据分析。
我有多个 患者 可能患有多种 疾病 。对于每种疾病,可能有也可能没有 治疗 或几种。每个 Treatment 可能有也可能没有 TreatmentDetails。 TreatmentDetails 通常在文件中重复(即文件名称不同,但疾病的 TreatmentDetails 相同或只是一个小的变化)。
我认为 Patient[i].Disease[j].Treatment[k]
类型的数据结构可能对这个问题有用。不幸的是,我不太擅长 类 或 OOP。
如何实现这种类型的数据结构Patient[i].Disease[j].Treatment[k]
?
下面是我的代码:
class PatientClass(object):
def __init__(self):
self.patient = []
def addPatient(self, PatientID, casVersion):
self.patient.append((False, PatientID, casVersion))
def patient_count(self):
return(len(self.patient))
def printPatient(self):
print(self.patient)
def printpatientN(self,n):
print(self.patient[n])
def __str__(self,n):
return(self.patient[n])
class Disease(PatientClass):
def __init__(self):
PatientClass.__init__(self)
self.disease = []
def addDisease(self, datetime_Start, datetime_End):
self.disease.append((False, datetime_Start, datetime_End))
def printDiseaseN(self,n):
print(self.disease[n])
def __str__(self,n):
return "%s has disease %s" % (self.patient[n], self.disease[n])
您可以从 'has-a' 范例的这个简单实现开始:
class Patient:
def __init__(self, patientID, casVersion):
self.patientID = patientID
self.casVersion = casVersion
self.disease = []
def addDisease(self, disease):
self.disease.append(disease)
return self
def __str__(self):
return "<Patient: %s, casVer: %s, disease: %s>" % (self.patientID, self.casVersion, " ".join([str(d) for d in self.disease]))
class Disease:
def __init__(self, datetimeStart, datetimeEnd):
self.datetimeStart = datetimeStart
self.datetimeEnd = datetimeEnd
self.treatment = []
def __str__(self):
return "<Disease: start: %s, end: %s, treatment: %s>" % (self.datetimeStart, self.datetimeEnd, " ".join([str(t) for t in self.treatment]))
# usage
print Patient("TheFirst", "Cas").addDisease(Disease("yesterday", "today"))
您可以利用内置的 Python dict
and/or list
机制并使用非常简单的 类 来构建您的数据。下面是存储 Patient
个对象的示例。它们是扩展的字典——我选择字典是因为它非常适合记录,你可以随时自由地添加你想要的字段,作为新键)。我还使用标准字典来存储 Patient
对象,使用它们的记录 ID 作为从容器 patients
字典中存储和检索患者对象的键。
显示的简单 类 扩展了 UserDict
(从 dict
继承的正确方法),具有针对患者疾病和治疗的 "has-a list of" 概念。
显示了一个用法示例,您可以看到通过继承可以使用许多内置的有用行为。
您可以将此结构用于您的数据或根据您的喜好和需要对其进行调整(例如:您可能希望通过使用属性来定义对某些属性的更简单的访问,写 .name
而不是 ['name']
,
请参阅 以获得简要说明,或者您可以通过其他方式扩展 类。
super().__init(...)
只是在添加更多属性的同时保留 类 的默认初始化,否则它们将无法正常运行,因为它们会覆盖默认值。 Treatment
不需要它,因为它没有重新定义 __init__
(还)
from collections import UserDict
# see also UserList, UserString
class Treatment(UserDict):
pass
class Disease(UserDict):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.treatments = []
class Patient(UserDict):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.diseases = []
patients = dict()
p1 = patients['0001'] = Patient(name='Eric', surname='Idle')
d1 = Disease(name='Eating too much')
t1 = Treatment(title='Radical Therapy', description='Mint pill after lunch.')
d1.treatments.append(t1)
d2 = Disease(name='Cannot Control the Legs Syndrome')
t2 = Treatment(title='Conservative Approach', description='Have a seat.')
d2.treatments.append(t2)
p1.diseases.extend([d1,d2])
for pid in patients:
print()
print('PID:{} {} {}'.format(pid, patients[pid]['name'],\
patients[pid]['surname']))
print(50*'-')
for disease in patients[pid].diseases:
print()
print('Disease: {}'.format(disease['name']))
for treatment in disease.treatments:
print('Treatment: {}'.format(treatment['title']))
print('\t\t{}'.format(treatment['description']))
我必须从一堆 XML 文件中提取患者信息以进行进一步的数据分析。
我有多个 患者 可能患有多种 疾病 。对于每种疾病,可能有也可能没有 治疗 或几种。每个 Treatment 可能有也可能没有 TreatmentDetails。 TreatmentDetails 通常在文件中重复(即文件名称不同,但疾病的 TreatmentDetails 相同或只是一个小的变化)。
我认为 Patient[i].Disease[j].Treatment[k]
类型的数据结构可能对这个问题有用。不幸的是,我不太擅长 类 或 OOP。
如何实现这种类型的数据结构Patient[i].Disease[j].Treatment[k]
?
下面是我的代码:
class PatientClass(object):
def __init__(self):
self.patient = []
def addPatient(self, PatientID, casVersion):
self.patient.append((False, PatientID, casVersion))
def patient_count(self):
return(len(self.patient))
def printPatient(self):
print(self.patient)
def printpatientN(self,n):
print(self.patient[n])
def __str__(self,n):
return(self.patient[n])
class Disease(PatientClass):
def __init__(self):
PatientClass.__init__(self)
self.disease = []
def addDisease(self, datetime_Start, datetime_End):
self.disease.append((False, datetime_Start, datetime_End))
def printDiseaseN(self,n):
print(self.disease[n])
def __str__(self,n):
return "%s has disease %s" % (self.patient[n], self.disease[n])
您可以从 'has-a' 范例的这个简单实现开始:
class Patient:
def __init__(self, patientID, casVersion):
self.patientID = patientID
self.casVersion = casVersion
self.disease = []
def addDisease(self, disease):
self.disease.append(disease)
return self
def __str__(self):
return "<Patient: %s, casVer: %s, disease: %s>" % (self.patientID, self.casVersion, " ".join([str(d) for d in self.disease]))
class Disease:
def __init__(self, datetimeStart, datetimeEnd):
self.datetimeStart = datetimeStart
self.datetimeEnd = datetimeEnd
self.treatment = []
def __str__(self):
return "<Disease: start: %s, end: %s, treatment: %s>" % (self.datetimeStart, self.datetimeEnd, " ".join([str(t) for t in self.treatment]))
# usage
print Patient("TheFirst", "Cas").addDisease(Disease("yesterday", "today"))
您可以利用内置的 Python dict
and/or list
机制并使用非常简单的 类 来构建您的数据。下面是存储 Patient
个对象的示例。它们是扩展的字典——我选择字典是因为它非常适合记录,你可以随时自由地添加你想要的字段,作为新键)。我还使用标准字典来存储 Patient
对象,使用它们的记录 ID 作为从容器 patients
字典中存储和检索患者对象的键。
显示的简单 类 扩展了 UserDict
(从 dict
继承的正确方法),具有针对患者疾病和治疗的 "has-a list of" 概念。
显示了一个用法示例,您可以看到通过继承可以使用许多内置的有用行为。
您可以将此结构用于您的数据或根据您的喜好和需要对其进行调整(例如:您可能希望通过使用属性来定义对某些属性的更简单的访问,写 .name
而不是 ['name']
,
请参阅
super().__init(...)
只是在添加更多属性的同时保留 类 的默认初始化,否则它们将无法正常运行,因为它们会覆盖默认值。 Treatment
不需要它,因为它没有重新定义 __init__
(还)
from collections import UserDict
# see also UserList, UserString
class Treatment(UserDict):
pass
class Disease(UserDict):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.treatments = []
class Patient(UserDict):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.diseases = []
patients = dict()
p1 = patients['0001'] = Patient(name='Eric', surname='Idle')
d1 = Disease(name='Eating too much')
t1 = Treatment(title='Radical Therapy', description='Mint pill after lunch.')
d1.treatments.append(t1)
d2 = Disease(name='Cannot Control the Legs Syndrome')
t2 = Treatment(title='Conservative Approach', description='Have a seat.')
d2.treatments.append(t2)
p1.diseases.extend([d1,d2])
for pid in patients:
print()
print('PID:{} {} {}'.format(pid, patients[pid]['name'],\
patients[pid]['surname']))
print(50*'-')
for disease in patients[pid].diseases:
print()
print('Disease: {}'.format(disease['name']))
for treatment in disease.treatments:
print('Treatment: {}'.format(treatment['title']))
print('\t\t{}'.format(treatment['description']))