python面向对象-最新笔记:__mro__、__dict__、类的创建方式、metaclass

0. 类的__mro__:属性继承顺序
class A(object):pass

class B(A):pass

class C(object):pass

class D(B,C):pass

print(D.__mro__)#属性继承顺序 
# (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>)
1. 类的__dict__ VS 对象的__dict__:
class Foo(object):
    TEST = 'test'
    def __init__(self,u,o):
        self.u = u
        self.o = o
    def func(self):
        pass

类的__dict__:
找到Foo类里面所有的属性,输出dict类型

print(Foo.__dict__)         #找到Foo类里面所有的属性,输出dict类型
{'__module__': '__main__', 'TEST': 'test', '__init__': <function Foo.__init__ at 0x014C8148>,
    'func': <function Foo.func at 0x014C8100>,
    '__dict__': <attribute '__dict__' of 'Foo' objects>,
    '__weakref__': <attribute '__weakref__' of 'Foo' objects>,
    '__doc__': None}

对象的__dict__:
找到Foo初始化init里面所有的属性,输出dict类型

print(Foo('u','o').__dict__)#找到Foo初始化init里面所有的属性,输出dict类型
{'u': 'u', 'o': 'o'}
2. python类的创建方式:
# 1.种
class Foo(object):
    something = 'st'

# 2.种
Foo0 =type('Foo',(object,),{"something":"st",'func_name':lambda self,x:x+1})
3. 类创建默认metaclass=type,自定义type
类的创建,就是默认type类创建的,因此,
我们可以自定义mytype继承type,在创建类时实现更多的功能
class Foo(object,metaclass=type):
    pass
'''
3.1 自定义type:MyType

这里就没有加其他自定义功能,只是做了print示意

class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')
3.2 使用自定义type创建类
class Foo_1(object,metaclass=MyType):# 当前类,由MyType创建
    pass
3.3 继承类,则metaclass同基类相同
class Foo_1(object,metaclass=MyType):# 当前类,由MyType创建
    pass

'''
创建的类Bar,继承一个由MyType自定义type类创建的类Foo_1,此时,类Bar也是由基类中的metaclass
即:继承类,则metaclass同基类相同
'''
class Bar(Foo_1):
    pass
3.4 函数的方式创建类
def with_metaclass(arg):
    return MyType('Base',(arg,),{})

# 等同于Foo_2继承Base类,且Base类是metaclass=MyType类创建
class Foo_2(with_metaclass(object)):
    pass
4. 实例化类时,执行过程总结
'''实例化'''
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

class Foo(object,metaclass=MyType):
    pass

obj = Foo()
'''
0.Foo类创建时,MyType的__init__
Foo()实例化时:
1.MyType的__call__
2.Foo的__new__
3.Foo的__init__
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Web Python Template Injection 是一种常见的 Web 漏洞型,通常缩写为 SSTI(Server Side Template Injection)。该漏洞是由于 Web 应用程序未正确处理用户输入导致的,攻击者可以通过构造恶意输入来执行任意代码或获取敏感信息。 Python 作为一种流行的 Web 开发语言,广泛应用于 Web 应用程序中。Python Web 框架(如 Flask、Django 等)通常使用模板引擎来生成动态内容。在模板引擎中,可以使用变量、表达式、条件语句、循环语句等功能来生成动态内容。然而,如果在模板引擎中直接使用用户输入作为变量或表达式的一部分,而没有对用户输入进行适当的验证和过滤,就可能导致模板注入漏洞。 例如,在 Flask 应用程序中,可以使用 Jinja2 模板引擎来生成动态内容。如果在模板中使用了用户输入的变量,攻击者可以构造恶意输入来执行任意代码。例如,以下代码中的 name 变量可能是用户输入的: ```python from flask import Flask, render_template, request app = Flask(__name__) @app.route('/') def index(): name = request.args.get('name', '') return render_template('index.html', name=name) if __name__ == '__main__': app.run(debug=True) ``` 在 index.html 中,可以使用 {{ name }} 来显示用户输入的 name 变量。如果攻击者在 name 中注入了模板代码,就可能导致模板注入漏洞。例如,攻击者可以构造如下的输入: ``` {{ ''.__class__.__mro__[1].__subclasses__()[414]('/etc/passwd').read() }} ``` 这段代码在模板引擎中会被解释为调用 Python 的 subprocess.Popen 函数执行命令 /etc/passwd,并读取其输出。攻击者可以通过这种方式执行任意代码,获取敏感信息或者直接控制服务器。 为了防止 SSTI 漏洞,开发人员应该对用户输入进行严格的验证和过滤,避免在模板引擎中直接使用用户输入作为变量或表达式的一部分。可以使用 Python 的安全模板引擎(如 jinja2-sandbox、jinja2-timeout 等)来限制模板执行的权限,或者使用模板引擎提供的安全过滤器(如 escape、safe 等)来过滤用户输入。此外,还应该及时更新 Web 应用程序和相关组件,以避免已知的漏洞攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷凝娇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值