在Python中初始化嵌套类

时间:2019-01-06 00:21:43

标签: python class

假设我要创建一个“房屋”类,该类具有自己的某些属性,但还具有一个(嵌套的)“居民”类,该类具有一些属性并具有强制性的“姓”。房屋实例可能存在,但没有任何居民。如何创建它,以便我最终可以执行以下操作?

myhouse = House()
residentX = myhouse.resident('Smith')

目前,我将其设置为嵌套类,但是在尝试初始化myhouse时遇到麻烦,因为此时嵌套嵌套Resident类需要一个姓氏(此时我不一定要有姓)< / p>

class House:
    def __init__(self):
        self.someattribute = <someattribute>
        self.resident = self.Resident()

    class Resident:
        def __init__(self, surname):
            self.surname = surname

我知道我可以重组代码以不使用嵌套类,然后在代码中将任何居民明确地绑定到房屋。但是,我想在此处使用点号(myhouse.resident)将居民自动绑定到房屋。

此外,我了解到python中的嵌套类有些皱眉-我愿意就如何以更pythonic的方式进行上述操作提出建议。

1 个答案:

答案 0 :(得分:3)

我将打破Resident类,并为.resident使用一个属性/设置器

赞:

class House:
    def __init__(self):
        self.someattribute = <someattribute>
        self._resident = None

    @property
    def resident(self):
        return self._resident

    @resident.setter
    def resident(self, surname):
        r = Resident(surname)
        self._resident = r

class Resident:
    def __init__(self, surname):
        self.surname = surname

但是,如果您希望.resident可以打电话但又想跟踪房屋的居民,则仍然可以突破Resident类,并使用:

class House:
    def __init__(self):
        self.someattribute = <someattribute>
        self.residents = []

    def resident(self, surname):
        '''
        Add a resident to the house
        '''
        r = Resident(surname)
        self.residents.append(r)
        return r

class Resident:
    def __init__(self, surname):
        self.surname = surname