首页 新闻 会员 周边 捐助

检查当前正在定义的类是否继承自 Model(直接或间接) 如果没有继承,就报错(比如在元类中做校验)。

0
[已关闭问题] 关闭于 2025-11-28 17:28

1. bases

  • 是一个元组,包含当前类的所有直接父类。
  • 比如:class Child(Parent1, Parent2): ... → bases = (Parent1, Parent2)

⚠️ 注意:如果类没有任何显式父类(如 class X: pass),bases = (object,)(Python 3 中所有类都隐式继承 object


2. bases and ...

  • 这是一个短路判断
    • 如果 bases 是空元组(比如 ()),那么 bases 为假值 → 整个条件为 False跳过后面的检查
    • 如果 bases 非空(比如 (Parent,)),则继续判断后面的 not any(...)

✅ 实际上在 Python 3 中 bases 永远不会为空(至少有 (object,)),所以这个 bases and 更多是防御性编程(兼容性或特殊场景)。


3. any(issubclass(b, Model) for b in bases)

这是核心!我们从里往外看:

▶ for b in bases

  • 遍历 bases 中的每一个父类 b

▶ issubclass(b, Model)

  • 判断 b 是否是 Model 的子类(包括 b is Model 本身)
  • 例如:
    Python
    编辑
     
     
    1issubclass(Model, Model)# True(自己是自己的子类)2issubclass(Child, Model)# True(如果 Child 继承 Model)3issubclass(str, Model)# False

▶ any(...)

  • 只要有一个 b 满足 issubclass(b, Model)any(...) 就返回 True
  • 如果所有都不满足,返回 False

💡 所以 any(...) 的意思是:“bases 中有没有任何一个类是 Model 或其子类?”


4. not any(...)

  • 对上面的结果取反:
    • 如果有继承 Model → any(...) == True → not True == False
    • 如果完全没有继承 Model → any(...) == False → not False == True
*Tesla*的主页 *Tesla* | 小虾三级 | 园豆:1152
提问于:2025-11-28 17:27
< >
分享
所有回答(1)
0

Django、SQLAlchemy 等框架的常见模式:强制用户继承某个基类,才能获得框架功能。

class BaseModel:
    def save(self):
        print("Saving to DB...")

class ORMType(type):
    def __new__(cls, name, bases, dct):
        if name != "BaseModel" and not any(issubclass(b, BaseModel) for b in bases):
            raise TypeError("所有模型必须继承 BaseModel")
        return super().__new__(cls, name, bases, dct)

class User(BaseModel, metaclass=ORMType):  # ✅
    pass

class Config(metaclass=ORMType):  # ❌ 不是模型,报错
    pass

数据库 ORM 模型

 
*Tesla* | 园豆:1152 (小虾三级) | 2025-11-28 17:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册