• Jinja2模板注入 | python模板注入特殊属性 / 对象讲解


    在进行模板利用的时候需要使用特殊的属性和对象进行利用,这里对这些特殊属性及方法进行讲解
    以下实验输出python3版本为 3.10.4python2版本为 2.7.13

    特殊属性

    • __class__ 类实例上使用,它用于获取该实例对应的类
    • __base__ 用于获取父类
    • __mro__ (Method Resolution Order)。__mro__ 属性返回一个元组,其中包含了类的继承链

    特殊方法

    • __subclasses__() 获取直接子类

    其他

    • __globals__ 一个特殊的变量,不使用在类上,而是用于函数,获取全局变量的字典
    • __builtins__ 它包含了 Python 内置的函数、异常和对象。这个模块使内置函数和对象在全局作用域中可用,无需显式导入


    一、特殊属性

    __class__

    使用在实例上,获取该实例对应的类

    class A:
        pass
    
    • 1
    • 2
    print(A)	# 类
    # __main__.A
    
    print(A())	# 实例
    # <__main__.A instance at 0x0000000002BA2348>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    关系如下

    A().__class__ == A
    # True
    
    • 1
    • 2

    __base__

    使用在类上,获取父类

    class A:
        pass
    
    class B(A):
        pass
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里分两个情况, python2和python3

    python2

    print(B)
    # __main__.B
    
    • 1
    • 2

    python3

    print(B)
    # 
    
    • 1
    • 2

    我对这两个表示也不是很理解,但是只有python3这种表示方式才能使用 __base__
    比如python3

    print(B.__base__)
    # 
    
    • 1
    • 2

    可以看到结果是父类 A

    python2我这里使用自带的类来演示
    () 是tuple的实例
    "" 是str的实例
    [] 是list的实例

    print(().__class__)
    print("".__class__)
    print([].__class__)
    
    # 
    # 
    # 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    可以发现输出的格式和python3输出自定义类的相似
    这里就可以使用 __base__

    print(().__class__.__base__)
    # 
    
    • 1
    • 2

    __mro__

    返回类的继承

    class A:
        pass
    
    class B(A):
        pass
    
    class C(B):
        pass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这里使用python3演示,因为要以下输出格式才有效

    <class 'xxx'>
    
    • 1

    python2 创建自定义类时没有这种效果

    print(C.__mro__)
    # (, , , )
    
    • 1
    • 2

    创建类时默认继承Object,所以继承链一共有3个对象
    在这里插入图片描述

    如果B此时多继承个D,那么C.__mro__ 就会有4个对象
    在这里插入图片描述


    二、特殊方法

    __subclasses__()

    获取直接子类
    __mro__不同,__subclasses__() 是一个方法,获取直接子类

    class A:
        pass
    
    class B(A):
        pass
    
    class C(B):
        pass
    
    class D(A):
        pass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    这里同样使用python3做演示,返回的是一个列表

    print(A.__subclasses__())
    # [, ]
    
    • 1
    • 2

    三、其他

    __globals__

    一个特殊的变量,不使用在类上,而是用于函数,获取全局变量的字典

    hello = "hello"
    world = "world"
    
    • 1
    • 2
    print(test.__globals__)
    # {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000211AE5D4A60>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'C:\\Users\\wlb\\Desktop\\test\\python\\7.py', '__cached__': None, 'hello': 'hello', 'world': 'world', 'test': }
    
    • 1
    • 2

    可以看到有很多键值对,几个熟悉的键值对

    'hello': 'hello', 
    'world': 'world', 
    'test': <function test at 0x000001FDD5E23E20>
    
    • 1
    • 2
    • 3

    上面有的键都可以直接使用 print打印出来
    比如最常见的

    print(__name__)
    
    • 1

    __builtins__

    它包含了 Python 内置的函数、异常和对象。这个模块使内置函数和对象在全局作用域中可用,无需显式导入

    我们直接可以使用的函数和对象都在该变量上

    print(__builtins__.print == print)
    # True
    
    • 1
    • 2

  • 相关阅读:
    Associative algebra
    【Java面试题】cookie和session的区别
    02-WPF_基础(二)
    网络-笔记
    数组和对象的扩展运算符
    验证一个小小的问题
    IOday5
    虚拟机Ubuntu扩展磁盘大小
    07JVM_内存模型和CAS与原子类
    清理docker 占用空间,volume挂载过大,清除镜像,容器,挂载数据
  • 原文地址:https://blog.csdn.net/qq_56313338/article/details/133846528