在 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']))