Discuss / Python / 中文注释

中文注释

Topic source

蘑菇蘑菇

#1 Created at ... [Delete] [Delete and Lock User]

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__里面了


  • 1

Reply