OOP class 设计建议。 class 可以实例化并使用另一个从同一父级 class 继承的 class 吗?

OOP class design advice. Can a class instantiate and use another class that inherits from the same parent class?

目前我有一系列 classes 将 API 请求 JSON 转换为对象。这些对象是根据我的数据库模式建模的。我认为我正在努力解决的部分是如何在我的数据库中表示那些由外键形成的实体关系。

以下 class 仅作为示例,实例变量与我的应用程序架构有很大不同。

class Table(ABC):
    def __init__(self):
        # stuff
        
    @abstractmethod
    def validateSchema(self):
        """Validates the resources column values."""
        pass


class ClassRoom(Table):
    def __init__(self, id, location_id, location):
        super().__init__()
        self.id = id
        self.location = Location(location_id, location)
        
    def validateSchema(self):
        # stuff

class Location(Table):
    def __init__(self, id, location):
        super().__init__()
        self.id = id
        self.location = location
        
    def validateSchema(self):
        # stuff
        

我关心的部分是当我创建一个与 class 相同类型的对象时,该对象将对象作为实例变量。

class ClassRoom(Table):
    def __init__(self, id, location_id, location):
        
        # Can I instantiate this class even if it inherits the same parent?
        self.location = Location(location_id, location)

这在 OOP 中可以吗?有没有更好的方法来设计我的 classes?

此外,这些 class 只是为发送到我的 API 的请求 JSON 定义的。它们的目的是促进列验证和其他一些目的。我希望在这些 classes 中实现的特定验证来自另一个 Whosebug post 。我不想在这里重新创建 SqlAlchemy。

您的 Table class 类似于 SqlAlchemy 的 db.Model class。正如它可以在不同的子 class 之间引用一样,你也可以。

您的Classroom.__init__()方法的具体设计似乎有误。同一位置的所有 class 房间都应引用同一个 Location 对象,但您为每个 class 房间创建了一个新对象。 Location 应该是一个参数,而不是位置 ID 和名称。

class ClassRoom(Table):
    def __init__(self, id, location):
        super().__init__()
        self.id = id
        self.location = location

然后您可以在一个位置创建多个class房间:

loc = Location(loc_id, loc_name)
c1 = Classroom(c1_id, loc)
c2 = Classroom(c2_id, loc)