Initialising nested classes in Python

匆匆过客 提交于 2021-01-29 05:17:37

问题


Let's say I want to create a class 'House' that has some attributes of its own, but also has a (nested?) 'Resident' class which has some attributes and has a mandatory attribute 'surname'. A house instance may exist though without any residents. How can create this so that I can eventually do the following?

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

Currently I set this up as a nested class but run into trouble when I try and initialise myhouse given that it is requiring a surname at this point for the nested Resident class (which I don't necessarily have at this point)

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

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

I know I can restructure the code to not use nested classes and then explicitly tie any resident to a house in my code. However, I would like to use the dot notation here (myhouse.resident) to automatically tie a resident to a house.

Also, I understand that nested classes in python are somewhat frowned upon - I'm open to suggestions on how to do the above in a more pythonic manner.


回答1:


I would break out the Resident class and use a property/setter for .resident

Like this:

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

However, if you want .resident to be callable but also want to track the house's residents, you can still break out the Resident class, and use:

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


来源:https://stackoverflow.com/questions/54057560/initialising-nested-classes-in-python

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!