当前位置:首页>python>Python学习--MetaClass(元类)详解②

Python学习--MetaClass(元类)详解②

  • 2026-02-06 21:04:34
Python学习--MetaClass(元类)详解②

一、元类的高级技巧

1. 方法注入和修改

class LoggingMeta(type):    """日志记录元类:自动为方法添加日志"""    def __new__(mcs, name, bases, attrs):        # 遍历所有方法        for attr_name, attr_value in attrs.items():            if callable(attr_value) and not attr_name.startswith('_'):                # 包装方法,添加日志                attrs[attr_name] = mcs.add_logging(attr_name, attr_value)        return super().__new__(mcs, name, bases, attrs)    @staticmethod    def add_logging(method_name, method):        """为方法添加日志装饰器"""        def wrapper(self, *args, **kwargs):            print(f"📝 [{self.__class__.__name__}.{method_name}] 开始执行")            print(f"   参数: args={args}, kwargs={kwargs}")            try:                result = method(self, *args, **kwargs)                print(f"   ✅ 执行成功,结果: {result}")                return result            except Exception as e:                print(f"   ❌ 执行失败,异常: {e}")                raise        # 复制原方法的名称和文档        wrapper.__name__ = method_name        wrapper.__doc__ = method.__doc__        return wrapperclass DataProcessor(metaclass=LoggingMeta):    """数据处理类(自动添加日志)"""    def process_data(self, data):        """处理数据"""        return [x * 2 for x in data if x > 0]    def validate(self, value, min_val, max_val):        """验证值是否在范围内"""        if min_val <= value <= max_val:            return True        raise ValueError(f"值 {value} 不在范围 [{min_val}{max_val}] 内")    def _private_method(self):        """私有方法,不会添加日志"""        return "这是私有方法"# 使用print("自动日志记录演示:")print("=" * 50)processor = DataProcessor()print("\n1. 调用 process_data 方法:")result = processor.process_data([1, -2305])print(f"最终结果: {result}")print("\n2. 调用 validate 方法(成功):")try:    processor.validate(5010)except ValueError as e:    print(f"验证失败: {e}")print("\n3. 调用 validate 方法(失败):")try:    processor.validate(15010)except ValueError as e:    print(f"验证失败: {e}")print("\n4. 调用私有方法(无日志):")result = processor._private_method()print(f"私有方法结果: {result}")

2. 属性和方法验证

class ValidationMeta(type):    """验证元类:自动验证方法和属性"""    def __new__(mcs, name, bases, attrs):        # 添加验证规则        validation_rules = {}        for attr_name, attr_value in attrs.items():            # 收集验证器            if attr_name.endswith('_validator'):                field_name = attr_name[:-10]                validation_rules[field_name] = attr_value            # 为方法添加参数验证            elif callable(attr_value) and hasattr(attr_value, '_validators'):                attrs[attr_name] = mcs.wrap_with_validation(attr_value)        # 修改__init__,添加属性验证        if '__init__' in attrs:            original_init = attrs['__init__']            attrs['__init__'] = mcs.wrap_init(original_init, validation_rules)        return super().__new__(mcs, name, bases, attrs)    @staticmethod    def wrap_with_validation(method):        """包装方法,添加参数验证"""        def wrapper(self, *args, **kwargs):            # 获取验证规则            validators = getattr(method, '_validators', {})            # 验证位置参数            for i, (arg_name, validator) in enumerate(validators.items()):                if i < len(args):                    validator(args[i])                elif arg_name in kwargs:                    validator(kwargs[arg_name])            return method(self, *args, **kwargs)        wrapper.__name__ = method.__name__        wrapper.__doc__ = method.__doc__        return wrapper    @staticmethod    def wrap_init(original_init, validation_rules):        """包装__init__,添加属性验证"""        def wrapper(self, *args, **kwargs):            # 先调用原始__init__            original_init(self, *args, **kwargs)            # 验证所有属性            for field_name, validator in validation_rules.items():                if hasattr(self, field_name):                    value = getattr(self, field_name)                    if value is not None:                        validator(value)        wrapper.__name__ = original_init.__name__        wrapper.__doc__ = original_init.__doc__        return wrapper# 验证器函数def validate_int(value):    if not isinstance(value, int):        raise TypeError(f"必须是整数,得到 {type(value).__name__}")def validate_str(value):    if not isinstance(value, str):        raise TypeError(f"必须是字符串,得到 {type(value).__name__}")    if len(value.strip()) == 0:        raise ValueError("字符串不能为空")def validate_age(value):    validate_int(value)    if value < 0 or value > 150:        raise ValueError(f"年龄必须在0-150之间,得到 {value}")def validate_email(value):    validate_str(value)    if '@' not in value:        raise ValueError(f"邮箱格式不正确: {value}")# 参数验证装饰器def validate_param(**validators):    """方法参数验证装饰器"""    def decorator(method):        method._validators = validators        return method    return decorator# 使用元类的类class Person(metaclass=ValidationMeta):    """人员类(自动验证)"""    # 属性验证器    age_validator = validate_age    email_validator = validate_email    name_validator = validate_str    def __init__(self, name, age, email=None):        self.name = name        self.age = age        self.email = email    @validate_param(value=validate_int, min_val=validate_int, max_val=validate_int)    def is_between(self, value, min_val, max_val):        """检查值是否在范围内"""        return min_val <= value <= max_val# 使用print("自动验证演示:")print("=" * 50)print("\n1. 创建有效的Person:")try:    person = Person("张三"25"zhang@example.com")    print(f"  创建成功: {person.name}{person.age}{person.email}")except (ValueError, TypeError) as e:    print(f"  创建失败: {e}")print("\n2. 创建无效的Person(年龄错误):")try:    person = Person("李四", -5"li@example.com")    print(f"  创建成功")except (ValueError, TypeError) as e:    print(f"  创建失败: {e}")print("\n3. 创建无效的Person(邮箱错误):")try:    person = Person("王五"30"invalid-email")    print(f"  创建成功")except (ValueError, TypeError) as e:    print(f"  创建失败: {e}")print("\n4. 使用方法验证:")try:    result = person.is_between(10020)    print(f"  验证结果: {result}")except (ValueError, TypeError) as e:    print(f"  验证失败: {e}")print("\n5. 方法参数验证失败:")try:    result = person.is_between("not_a_number"020)    print(f"  验证结果: {result}")except (ValueError, TypeError) as e:    print(f"  验证失败: {e}")

二、元类的最佳实践和注意事项

1. 元类的继承

class MetaA(type):    def __new__(mcs, name, bases, attrs):        print(f"【MetaA】创建类: {name}")        attrs['from_meta_a'] = True        return super().__new__(mcs, name, bases, attrs)class MetaB(type):    def __new__(mcs, name, bases, attrs):        print(f"【MetaB】创建类: {name}")        attrs['from_meta_b'] = True        return super().__new__(mcs, name, bases, attrs)# 元类组合(通过继承)class CombinedMeta(MetaA, MetaB):    """组合多个元类"""    def __new__(mcs, name, bases, attrs):        print(f"【CombinedMeta】创建类: {name}")        # 调用所有父元类        for base in mcs.__bases__:            if base is not type:                cls = base.__new__(base, name, bases, attrs)                attrs.update(cls.__dict__)        return super().__new__(mcs, name, bases, attrs)class MyClass(metaclass=CombinedMeta):    passprint(f"\nMyClass属性:")print(f"  from_meta_a: {getattr(MyClass, 'from_meta_a'False)}")print(f"  from_meta_b: {getattr(MyClass, 'from_meta_b'False)}")# 注意:多重继承元类要小心MRO问题print(f"\n元类MRO: {CombinedMeta.__mro__}")

2. 性能考虑

import timedef test_metaclass_performance():    """测试元类性能"""    class SimpleMeta(type):        def __new__(mcs, name, bases, attrs):            return super().__new__(mcs, name, bases, attrs)    # 测试1:使用元类创建类    start = time.time()    for i in range(10000):        class_name = f"DynamicClass{i}"        DynamicClass = type(class_name, (), {})    time_type = time.time() - start    # 测试2:使用自定义元类创建类    start = time.time()    for i in range(10000):        class_name = f"MetaClass{i}"        MetaClass = SimpleMeta(class_name, (), {})    time_meta = time.time() - start    # 测试3:使用复杂元类创建类    class ComplexMeta(type):        def __new__(mcs, name, bases, attrs):            # 复杂操作            attrs['processed'] = True            for key in list(attrs.keys()):                if not key.startswith('_'):                    attrs[f'_{key}'] = attrs[key]            return super().__new__(mcs, name, bases, attrs)    start = time.time()    for i in range(10000):        class_name = f"ComplexClass{i}"        ComplexClass = ComplexMeta(class_name, (), {'x': i})    time_complex = time.time() - start    print("元类性能测试 (创建10000个类):")    print("=" * 50)    print(f"使用type():         {time_type:.4f}秒")    print(f"使用简单元类:       {time_meta:.4f}秒")    print(f"使用复杂元类:       {time_complex:.4f}秒")    print(f"\n性能比较:")    print(f"  简单元类 vs type:  {time_meta/time_type:.1f}倍")    print(f"  复杂元类 vs type:  {time_complex/time_type:.1f}倍")test_metaclass_performance()

3. 何时使用元类

"""✅ 适合使用元类的场景:1. 框架开发:ORM、Web框架、插件系统等2. API设计:自动注册、验证、序列化3. 代码生成:根据配置动态生成类4. 接口约束:强制子类实现特定方法5. 单例模式:确保类只有一个实例❌ 不适合使用元类的场景:1. 简单业务逻辑:普通类足够2. 性能敏感:元类有额外开销3. 团队协作:增加理解难度4. 过度设计:KISS原则(Keep It Simple, Stupid)📝 最佳实践:1. 提供清晰的文档和示例2. 保持元类简单和透明3. 优先使用类装饰器(如果可能)4. 考虑向后兼容性5. 充分测试元类行为"""

总结

重要原则

  1. 元类影响所有子类(除非子类指定其他元类)

  2. 元类的方法第一个参数是类本身(cls),不是self

  3. 元类应尽量简单,避免过度复杂

  4. 考虑使用类装饰器作为更简单的替代方案

元类的力量

  • ✅ 控制类创建:完全控制类的生成过程

  • ✅ 自动注册:框架自动发现和注册组件

  • ✅ 验证和约束:确保类符合特定规范

  • ✅ 代码注入:自动添加方法和属性

元类是 Python 中最强大的特性之一,合理使用可以创建出非常优雅和强大的框架。

请在微信客户端打开

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-07 12:19:31 HTTP/2.0 GET : https://f.mffb.com.cn/a/473973.html
  2. 运行时间 : 0.120994s [ 吞吐率:8.26req/s ] 内存消耗:4,526.03kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=c1799919f8da5d36767f00576f3f6eca
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000614s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000839s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000962s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.013961s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000712s ]
  6. SELECT * FROM `set` [ RunTime:0.002803s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000788s ]
  8. SELECT * FROM `article` WHERE `id` = 473973 LIMIT 1 [ RunTime:0.000872s ]
  9. UPDATE `article` SET `lasttime` = 1770437971 WHERE `id` = 473973 [ RunTime:0.010432s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.003548s ]
  11. SELECT * FROM `article` WHERE `id` < 473973 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.007290s ]
  12. SELECT * FROM `article` WHERE `id` > 473973 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.004486s ]
  13. SELECT * FROM `article` WHERE `id` < 473973 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001741s ]
  14. SELECT * FROM `article` WHERE `id` < 473973 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000661s ]
  15. SELECT * FROM `article` WHERE `id` < 473973 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000711s ]
0.122700s