1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| class FieldType: """字段类型基类""" def __init__(self, default=None, required=False): self.default = default self.required = required def validate(self, value): """验证字段值""" if value is None and self.required: raise ValueError("Required field cannot be None") return self.convert(value) if value is not None else self.default def convert(self, value): """类型转换,子类重写""" return value
class StringField(FieldType): """字符串字段""" def __init__(self, max_length=None, **kwargs): super().__init__(**kwargs) self.max_length = max_length def convert(self, value): str_value = str(value) if self.max_length and len(str_value) > self.max_length: raise ValueError(f"String too long: {len(str_value)} > {self.max_length}") return str_value
class IntegerField(FieldType): """整数字段""" def convert(self, value): try: return int(value) except (ValueError, TypeError): raise ValueError(f"Cannot convert {value} to integer")
class ModelMeta(type): """ORM模型的元类""" def __new__(mcs, name, bases, namespace): fields = {} for key, value in list(namespace.items()): if isinstance(value, FieldType): fields[key] = value namespace.pop(key) for base in bases: if hasattr(base, '_fields'): parent_fields = base._fields.copy() parent_fields.update(fields) fields = parent_fields namespace['_fields'] = fields cls = super().__new__(mcs, name, bases, namespace) return cls
class Model(metaclass=ModelMeta): """ORM模型基类""" def __init__(self, **kwargs): self._data = {} for field_name, field_type in self._fields.items(): value = kwargs.get(field_name) try: self._data[field_name] = field_type.validate(value) except ValueError as e: raise ValueError(f"Field '{field_name}': {e}") def __getattr__(self, name): if name in self._fields: return self._data.get(name) raise AttributeError(f"'{self.__class__.__name__}' has no attribute '{name}'") def __setattr__(self, name, value): if name.startswith('_'): super().__setattr__(name, value) elif name in self._fields: try: self._data[name] = self._fields[name].validate(value) except ValueError as e: raise ValueError(f"Field '{name}': {e}") else: raise AttributeError(f"'{self.__class__.__name__}' has no field '{name}'") def to_dict(self): """转换为字典""" return self._data.copy() def __repr__(self): field_strs = [f"{k}={v!r}" for k, v in self._data.items()] return f"{self.__class__.__name__}({', '.join(field_strs)})"
class User(Model): """用户模型""" username = StringField(max_length=50, required=True) email = StringField(required=True) age = IntegerField(default=0) bio = StringField(max_length=200)
class Article(Model): """文章模型""" title = StringField(max_length=100, required=True) content = StringField(required=True) author_id = IntegerField(required=True) view_count = IntegerField(default=0)
try: user = User(username="john_doe", email="john@example.com", age="25") print(f"创建用户: {user}") print(f"用户数据: {user.to_dict()}") user.bio = "Python developer" print(f"更新后: {user}") article = Article( title="Python元类详解", content="本文深入讲解Python元类机制...", author_id=1 ) print(f"创建文章: {article}") print(f"用户年龄类型: {type(user.age)} = {user.age}") except ValueError as e: print(f"验证错误: {e}")
try: invalid_user = User(username="a" * 60, email="") except ValueError as e: print(f"创建失败: {e}")
|