再看Python基础知识

 1. type 和 object的关系

(1)type 是object的类;(2)type继承了object; (3)type是type自己的类。

所有的类(包括type),除了object都继承自object。【object是所有类的基类,包括type】

展开说

object 类:这是所有类的基类。每个类(包括内置类型)都直接或间接地继承自 object。这意味着每一个对象都是 object 类的一个实例。

type 类:任何数据类型(如int,str,list 等等)的类型都是type。此外, type类自身也是一个对象,因此它是object的一个实例。

它们之间的关系
所有对象(包括 type 对象)都是 object 类的实例。
所有类型(包括 object 类本身)都是 type 类的实例。
type 类是自身的实例,也就是说 type 是一个元类(metaclass),即它的类型是它自己 (type(type) is type)。
object 类是最顶层的基类,没有基类(除了它自身之外)。同时,object 类的类型是 type (type(object) is type)。

2. 一切皆对象

对象对应的就是地址。例如不同类型的变量可以赋值,实现的本质,就是变量指向的是一个内存地址。

3.可变类型与不可变类型

-- 可变类型:字典、列表、集合

--不可变类型:数字、字符串、元组

注意:

(1)字典的key必须用不可变类型,可以hash。

(2)Python中的参数传递:python中参数传递都是copy一份传递过去,由于一切皆对象,传递过去的都是地址。python中区分可变与不可变类型,可变类型在函数中修改会影响原来的,不可变类型,不会影响原来的。

 4.比较运算符(is 和 ==)

is比较的是id(id(值)),双等号比较的是值。

其id相同则值肯定相同,而值相同,其id则不一定相同。

 5.字符编码

bit:比特位,0或者1。

byte:8个bit位(比特位)是一个byte,就是一个字节。八个二进制可以组合出256中状态,即一个字节可以用来表示256种不同的状态,每个状态对应一个符号,也就是256个符号。

ASCII编码:在电脑初期,1个字节,2的8次方变化,就可以表示出 欧美 国家所有的字符(数字、字母、标点符号),对英语字符与二进制之间的关系,做了统一规定, 这就是ASCII编码。ASCII码一共规定了128个字符的编码,例如空格SPACE是32(二进制00100000),大写字母A是65(01000001)。这128个字符(包括32个不能打印出来的控制符合),只占用了一个字节的后面7位。最前面的一位统一规定为0.

 

随着 电脑的在世界范围的推广,这显然不够。

gbk编码:计算机到了中国,为了更好的兼容汉字,就推出了gbk编码。 

Unicode: 就像它的名字表示的,为世界上所有的字符都分配了一个唯一的数字编号(戏称万国码)。这个编号范围从0x000000到0x10FFFFF(十六进制),有110多万,每个字符都有一个唯一的Unicode。旨在为世界上所有的字符集提供统一的编码方式,它的目标是支持所有现代和历史上的书写系统中的每一个字符,使得文本数据可以在不同的平台、程序和语言之间无歧义地交换。换句话说,Unicode ,在世界范围,统一了字符和数字的对应关系。Unicode 字符的字节长度取决于所使用的具体编码形式。16进制,就是4个字节。

utf-8(全称Unicode Transformation Format,即unicode的转换格式),utf-8是不定长的。存储中,如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少字节。可以说,utf-8定义Unicode在硬盘上的具体存储方式。

那为何在内存中不直接使用utf-8呢?

utf-8是不定长的:一个英文字符占1Bytes,一个中文字符占3Bytes,生僻字用更多的Bytes存储
 
也就意味着如果用户输入的字符是:你y好,在内存中需要先经历计算的过程:“你”应该用3Bytes,“y”应该用1Bytes,“好”应该用3Bytes,
然后才能存储,所以内存中如果直接使用utf
-8格式去存储字符,耗费的总时间=计算时间+存储时间,而内存中使用定长的unicode格式存储字符,就省去了计算时间,
所以内存中使用unicode来存储字符会浪费空间,但是会提升速度,这是一种用空间换时间的方法

更多内容请参阅--https://www.cnblogs.com/liuqingzheng/articles/17386883.html

 6.闭包函数

闭包(closure)指的是在函数内部定义了另外一个函数,并返回了这个内部函数作为函数对象,同时还保存了外层函数的状态信息。这个内部函数可以依赖外层函数的变量和参数,而且外层函数返回的是这个内部函数的引用。这种在函数内部定义函数并返回的方式称为闭包。

(1)定义在函数内部;

(2)对外部作用域有引用(使用到了外部作用域的变量)。

【思想:在Python语言中,函数是一等公民,可以赋值给一个变量。】

装饰器是闭包函数的典型应用。

7.装饰器

函数装饰器是 Python 中的一种高级功能,它允许程序员在不修改原函数代码的情况下,增加额外的功能。装饰器本质上是一个接受函数作为参数的函数,并返回一个新的函数或修改后的函数。它们通常用于日志记录、访问控制、性能测试、事务处理等场景。

示例1

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

使用 @ 符号可以更方便地应用装饰器到函数上:

@my_decorator   ###一定要注意 此处不能带()
def say_hello():
    print("Hello!")

示例2 --参数传递

如果被装饰的函数需要接收参数,那么装饰器内部的 wrapper 函数也需要能够接收这些参数。为了使装饰器支持任意数量的位置参数和关键字参数,可以使用 *args**kwargs

复制代码
def do_twice(func):
    def wrapper_do_twice(*args, **kwargs):
        func(*args, **kwargs)
        return func(*args, **kwargs)
    return wrapper_do_twice

@do_twice
def greet(name):
    print(f"Hello {name}")

greet("Alice")
复制代码

这段代码定义了一个名为 do_twice 的装饰器,它可以用来装饰任何函数,使其行为变为执行两次。

 8.wsgi协议

WSGI(Web Server Gateway Interface)是Python Web应用程序和Web服务器之间的接口标准,它定义了一个简单的API,使得Python Web应用程序可以被部署在多种Web服务器上,而无需修改应用程序代码。

WSGI库是实现WSGI接口的Python库,它提供了开发Web应用程序和Web框架的工具和组件,包括路由、请求/响应对象、中间件、模板引擎等。

Django是一个强大的Web应用框架,也是基于WSGI标准实现的。Django提供了完整的MVC架构、ORM、路由、请求/响应对象、模板引擎等组件,同时也支持插件和扩展。

9.视图的结果形式---响应对象HttpResponse

view 视图 中返回结果的四种形式 

  • HttpResponse()    ----响应多种数据类型
  • JsonResponse()  -----响应Json数据
  • render()               ----渲染响应HTML模板
  • redirect()             -----重定向

9.1 HttpResponse()

参数形式

HttpResponse(content, #响应体数据,返回给视图函数的内容
content_type=None,#响应体数据的类型, text/html文本 ---这个是默认、text/plain、css、js、xml、json
status=None,#http响应状态码 404 200---200是默认
charset=None,
*args,
**kwargs)

例如 archry 系统中的一段代码 【https://gitee.com/rtttte/Archery/blob/master/sql/resource_group.py

复制代码
import simplejson as json
from django.http import HttpResponse

def
group(request): """获取资源组列表""" limit = int(request.POST.get("limit")) offset = int(request.POST.get("offset")) limit = offset + limit search = request.POST.get("search", "") # 过滤搜索条件 group_obj = ResourceGroup.objects.filter(group_name__icontains=search, is_deleted=0) group_count = group_obj.count() group_list = group_obj[offset:limit].values( "group_id", "group_name", "ding_webhook" ) # QuerySet 序列化 rows = [row for row in group_list] result = {"total": group_count, "rows": rows} # 返回查询结果 return HttpResponse( json.dumps(result, cls=ExtendJSONEncoder, bigint_as_string=True), content_type="application/json", )
复制代码

9.2 JsonResponse()

将对象dump成json字符串,然后将此json字符串封装成Response对象返回给浏览器。

场景:前端需要Json数据,此时,后端通过此方法构造JSON数据响应给 前端。

Django提供了JsonResponse构造并响应Json数据:

(1)将响应数据转换为Json字符串;(2)设置相应头Content-Type为application/json;(3)默认情况下JsonResponse只能对字典进行jump,如果想要对非字典的数据进行jump,那么需要给JsonResponse传递一个safe=False参数。

def test_jsonview(request):
    info_dict = {'name': 'tom', 'age': 18} ###字典形式
    # json_str = json.dumps(info_dict)
    # resp = HttpResponse(json_str, content_type='application/json')
    resp = JsonResponse(info_dict)
    return resp

9.3 render()

render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
用途:结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
格式与参数
render(request,  ###用于生成响应的请求对象。
 template_name ###要使用的模板的完整名称,可选的参数
[, context]) ###添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
实例,来源于Archery 【https://gitee.com/rtttte/Archery/blob/master/sql/sql_workflow.py
复制代码
def alter_run_date(request):
    """
    审核人修改可执行时间
    :param request:
    :return:
    """
    workflow_id = int(request.POST.get("workflow_id", 0))
    run_date_start = request.POST.get("run_date_start")
    run_date_end = request.POST.get("run_date_end")
    if workflow_id == 0:
        context = {"errMsg": "workflow_id参数为空."}
        return render(request, "error.html", context)

    user = request.user
    if Audit.can_review(user, workflow_id, 2) is False:
        context = {"errMsg": "你无权操作当前工单!"}
        return render(request, "error.html", context)

    try:
        # 存进数据库里
        SqlWorkflow(
            id=workflow_id,
            run_date_start=run_date_start or None,
            run_date_end=run_date_end or None,
        ).save(update_fields=["run_date_start", "run_date_end"])
    except Exception as msg:
        context = {"errMsg": msg}
        return render(request, "error.html", context)

    return HttpResponseRedirect(reverse("sql:detail", args=(workflow_id,)))
复制代码

9.4 redirect()

 跳转页面时使用,用来实现 【重定向】。

传递参数是要重定向的一个硬编码的URL或者 一个完整的URL。

【redirect 、前面例子中HttpResponseRedirect()、反向解析reverse() 以及啥是硬编码的URL,可以参照这个分享:https://www.jianshu.com/p/3d99ddd5148f

10.HttpRequest 类

可以阅读《https://www.cnblogs.com/liuqingzheng/archive/9509801.html

11. sys.argv 用法 

首先看下 sys。 “sys” 是 “system”,是一个系统模块,该模块提供了一些接口,用户访问python解释器自身使用和维护的变量,同时模块中还提供了一些函数。

而argv就是模块里的一个函数。“argv” 即 “argument value” 是一个列表对象,其中存储的是在命令行调用 python 脚本是提供的 “命令行参数”,即它包含了命令行传递给Python脚本的参数。

sys.argv是一个列表
sys.argv[0]是被调用的脚本文件名或全路径

sys.argv[1]就是我们从程序外部输入的第一个参数。

sys.argv[1:] 依次打印出输入的元素参数。

12.__getattr__()

在 Python 中,__getattr__() 是一个特殊方法(也称为魔术方法),它定义了当尝试访问一个不存在的属性时应该执行的行为。这意味着如果你试图访问一个对象的属性,而这个属性并没有在实例的 __dict__ 或类中定义,Python 会调用 __getattr__() 方法,并将属性名作为字符串传递给它。

示例

复制代码
class Test(object):
    def __getattr__(self, name):
        print(f"你尝试访问的属性 '{name}' 不存在。")
        return "默认值"

t = Test()
print(t.this_property_does_not_exist)
# 输出: 你尝试访问的属性 'this_property_does_not_exist' 不存在。
#       默认值
复制代码

在这个例子中,当我们尝试访问一个不存在的属性 this_property_does_not_exist 时,__getattr__() 被触发,并返回了一个默认值。

注意事项

  • 如果你在类中定义了某个属性,然后又尝试通过 __getattr__() 来捕获对该属性的访问,这是不会工作的,因为 __getattr__() 只会在属性找不到的情况下被调用。
  • __getattr__() 和 __getattribute__() 的区别在于,__getattribute__() 对所有属性访问都会调用,这可能导致无限递归,如果直接或者间接地访问了实例的属性字典的话。因此,通常建议只重写 __getattr__() 除非有明确的需求要重写 __getattribute__()。

 13 魔法方法(Magic Methods)

在 Python 中,魔法方法(Magic Methods),也被称为特殊方法(Special Methods)或双下划线方法(Dunder Methods, 由于它们的名称前后都有双下划线 __),是定义在类中的特殊方法,用于实现各种语言级别的功能。这些方法允许你自定义类的行为,使得对象可以像内置类型一样进行操作。

类别 方法 用途

基本构造与初始化

__init__(self, ...) 构造函数,在创建实例时自动调用,用于初始化对象。
__new__(cls, ...) 创建实例时首先调用的方法(比__init__方法还要早),通常用于控制不可变类型的实例创建过程。
__del__(self) 析构器,当对象即将被销毁时调用。
操作符重载 __add__(self, other) 实现加法操作 +
__sub__(self, other) 实现减法操作 -
__mul__(self, other) 实现乘法操作 *
__truediv__(self, other) 实现真除法操作 /
__floordiv__(self, other) 实现整除操作 //
__mod__(self, other) 实现取模操作 %
__pow__(self, other[, modulo]) 实现幂运算 **
比较操作符 __eq__(self, other) 实现等于比较 ==。
__ne__(self, other) 实现不等于比较 !=
__lt__(self, other) 实现小于比较 <
__le__(self, other) 实现小于等于比较 <=
__gt__(self, other) 实现大于比较 >
__ge__(self, other) 实现大于等于比较 >=

表示和字符串转换

__str__(self) 定义对象的非正式字符串表示,适用于 print() 和 str() 函数。
__repr__(self) 定义对象的正式字符串表示,适用于 repr() 函数,理想情况下应该返回一个能够重建该对象的表达式。
__format__(self, format_spec) 定义对象在格式化字符串中的表现形式,如使用 format() 函数或 f-string。
属性访问控制 __getattr__(self, name) 当尝试访问未定义的属性时调用。
__setattr__(self, name, value) 设置属性时调用。
__delattr__(self, name) 删除属性时调用。
集合、迭代器相关 __len__(self) 返回集合的长度,适用于 len() 函数。
__getitem__(self, key) 定义通过键获取元素的行为,如 obj[key]。
__setitem__(self, key, value) 定义通过键设置元素的行为。
__iter__(self) 返回一个迭代器对象。
__next__(self) 定义迭代器的下一个元素。
其他 __call__(self, *args, **kwargs) 使对象可以像函数一样被调用。执行 对象名() 时会触发。需要理解的是,类也是对象,所以,类() --即类的实例化过程 会调用元类的__call__
__enter__(self) 支持上下文管理协议,用于 with 语句。
__exit__(self, exc_type, exc_val, exc_tb)
posted @   东山絮柳仔  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2019-01-07 MySQL 基础知识梳理学习(二)----记录在页面层级的组织管理
点击右上角即可分享
微信分享提示