class Field(object):
def __init__(self, column_name, column_type):
self.column_name = column_name
self.column_type = column_type
def __repr__(self):
return f'<{self.__class__}: {self.column_name}>'
class StringField(Field):
def __init__(self, name):
super().__init__(name, "varchar(255)")
class IntegerField(Field):
super().__init__(name, 'int')
class ModelMetaclass(type):
def __new__(mcs, name: str, bases: tuple, attrs: dict, **kwargs: dict):
if name != 'Model':
# 如果Model是通过继承初始化时(比如 User(Model)),执行以下步骤
__table__ = name.lower()
# 通过model的额外属性自定义表名
if isinstance(kwargs.get('table'), str):
__table__ = kwargs.get('table')
if isinstance(kwargs.get('table_prefix'), str):
__table__ = f"{kwargs.get('table_prefix')}{__table__}"
# 删掉User类的静态属性, 把所有静态属性改写到__mapper__里
__mapper__ = {}
for k, v in attrs.items():
if isinstance(v, Field):
__mapper__[k] = v
for k in __mapper__.keys():
if __mapper__.get(k) is not None:
del attrs[k]
attrs['__table__'] = __table__
attrs['__mapper__'] = __mapper__
# 这里不可以用type()函数
# 区别: type()是根据已经定义的class去创建的,会做属性检查,自定义的__mapper__是无法创建的
# type.__new__()是完全创建一个新的class, 这里的class类似JAVA中的ClassLoader刚加载进来的那个class
return type.__new__(mcs, name, bases, attrs)
class Model(object, metaclass=ModelMetaclass):
def __init__(self):
print("model初始化")
class User(Model, table_prefix='my_', table='users'):
id = IntegerField('id')
name = StringField('username')
email = StringField('email')
password = StringField('password')
super().__init__()
print("user初始化")
return f"<User> table={self.__table__}, fields={self.__mapper__}"
user1 = User()
print(user1.__mapper__)
print(user1.__table__) # my_users
print(user1.id) # 报错 已经把静态属性删掉了,改写到__mapper__里面了
Sign in to make a reply
蘑菇蘑菇
class Field(object):
def __init__(self, column_name, column_type):
self.column_name = column_name
self.column_type = column_type
def __repr__(self):
return f'<{self.__class__}: {self.column_name}>'
class StringField(Field):
def __init__(self, name):
super().__init__(name, "varchar(255)")
class IntegerField(Field):
def __init__(self, name):
super().__init__(name, 'int')
class ModelMetaclass(type):
def __new__(mcs, name: str, bases: tuple, attrs: dict, **kwargs: dict):
if name != 'Model':
# 如果Model是通过继承初始化时(比如 User(Model)),执行以下步骤
__table__ = name.lower()
# 通过model的额外属性自定义表名
if isinstance(kwargs.get('table'), str):
__table__ = kwargs.get('table')
if isinstance(kwargs.get('table_prefix'), str):
__table__ = f"{kwargs.get('table_prefix')}{__table__}"
# 删掉User类的静态属性, 把所有静态属性改写到__mapper__里
__mapper__ = {}
for k, v in attrs.items():
if isinstance(v, Field):
__mapper__[k] = v
for k in __mapper__.keys():
if __mapper__.get(k) is not None:
del attrs[k]
attrs['__table__'] = __table__
attrs['__mapper__'] = __mapper__
# 这里不可以用type()函数
# 区别: type()是根据已经定义的class去创建的,会做属性检查,自定义的__mapper__是无法创建的
# type.__new__()是完全创建一个新的class, 这里的class类似JAVA中的ClassLoader刚加载进来的那个class
return type.__new__(mcs, name, bases, attrs)
class Model(object, metaclass=ModelMetaclass):
def __init__(self):
print("model初始化")
class User(Model, table_prefix='my_', table='users'):
id = IntegerField('id')
name = StringField('username')
email = StringField('email')
password = StringField('password')
def __init__(self):
super().__init__()
print("user初始化")
def __repr__(self):
return f"<User> table={self.__table__}, fields={self.__mapper__}"
user1 = User()
print(user1.__mapper__)
print(user1.__table__) # my_users
print(user1.id) # 报错 已经把静态属性删掉了,改写到__mapper__里面了