首页 > 编程语言 >【Python】0基础学Python——函数参数传递、函数细分、类的信息、元类、自定义元类、pickle序列化、序列化升级

【Python】0基础学Python——函数参数传递、函数细分、类的信息、元类、自定义元类、pickle序列化、序列化升级

时间:2024-11-21 18:46:08浏览次数:3  
标签:__ name Python self 元类 Person print 序列化

0基础学Python——函数参数传递、函数细分、类的信息、元类、自定义元类、pickle序列化、序列化升级

函数参数传递

参数传递

不可变类型: 值传递(深拷贝)
可变类型: 引用传递(浅拷贝)

类型标注

基本类型: int float bool None bytes Any
引用类型: from typing import
List,Tuple,Set,Dict,
Union[int,str]:混合数据类型
Iterable: 可迭代对象
Callable: 函数,可调用
Any:任意类型

from typing import List, Tuple, Set, Dict, Union, Iterable, Callable, Any


def fn(it: Iterable, task: Callable, hh: bytes, any: Any) -> str:
    pass


def test(n) -> Union[str, int, Callable]:
    n += 1
    return n


a = 10
test(a)
print(a)  # 10


def test2(ls):
    ls[0] += 1
    return ls


l = [10, 20, 30]
test2(l)
print(l[0])  # 11

函数细分

根据参数和返回值进行函数分类:
任务型函数: 没有参数,没有返回值
消费型函数: 有参数,没有返回值
生产型函数: 没有参数,有返回值
功能型函数: 有参数,有返回值
断言型函数:一种特殊的功能型函数,返回的是bool类型

task任务型函数

# 写一个函数执行某个任务
# task:任务型函数
def fn(task: Callable):
    task()


fn(lambda: print('喵喵'))  # 喵喵
fn(lambda: print('汪汪'))  # 汪汪

consumer消费型函数

# 写一个函数用来消费列表中的数据
# consumer:消费型函数
def consumer(ls, consumer: Callable):
    for item in ls:
        consumer(item)


l = [10, 20, 30]
consumer(l, lambda item: print(item * 2))
consumer(l, print)

functional功能型函数

# 定义 map_ls 返回新的处理后的列表   [1,2,3]=>[2,4,9]  [1,2,3]=>[11,12,13]
# functional:功能型函数
def map_ls(ls, function: Callable):
    # nls = []
    # for item in ls:
    #     res = function(item)
    #     nls.append(res)
    # return nls
    return [function(item) for item in ls]


print(map_ls(l, lambda item: item * 2))
print(map_ls(l, lambda item: item + 66))

类的信息

class Person:
    """
        -----类注释-----
    """
    PI = 3.14

    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f'{self.name}'

    def eat(self):
        return f'{self.name}在偷吃'


p = Person('张三')
print(p.eat())

# 查看对象所有信息
print(p.__dict__)  # 属性字典信息  # {'name': '张三'}

# 查看类的信息
print(Person.__doc__)  # 查看类注释  # -----类注释-----
print(Person.__name__)  # 查看类名  #Person
print(Person.__class__)  # 查看类的类型  # <class 'type'>
print(Person.__dict__)  # 类的成员组成的字典
print(Person.__bases__)  # 父类元组  # (<class 'object'>,)

元类

万物皆为对象,类也是个对象,类也有所属类型
type(元类):类的类型,创建类的
type的类型还是type
type的父类是object

class Person:
    """
        -----类注释-----
    """
    PI = 3.14

    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f'{self.name}'

    def eat(self):
        return f'{self.name}在偷吃'


p = Person('张三')
print(p.eat())
print(type(10))  # <class 'int'>
print(type(p))  # <class '__main__.Person'>
print(p.__class__)  # <class '__main__.Person'>
print(type(Person))  # <class 'type'>
print(Person.__class__)  # <class 'type'>
print(type(type))  # <class 'type'>

type作用

1.判断数据的类型
2.创建一个新的类型(类)
3.拦截类的信息,修改类的创建过程

# type('类型',父类元组,类成员字典)
myclass = type('Person', (object,), {
    'PI': 3.14,
    '__init__': lambda self, name: setattr(self, 'name', name),
    '__doc__': '-----类注释-----',
    'eat': lambda self: print(f'{self.name}在偷吃')
})
# myclass是别名
print(myclass.__name__)  # Person
zs = myclass('张三')
zs.eat()  # 张三在偷吃
print(zs.PI, zs.name, zs.__doc__)  # 3.14 张三 -----类注释-----
print(lambda item: item % 2 == 0)
ls = [1, 2, 3, 4, 1, 2]
for index in range(len(ls)):
    if ls[0] < 3:
        ls.pop(0)
    else:
        break
print(ls)

自定义元类

元类(type):类的类型
作用:
1.type(val) 获取数据类型
2.创建类
3.自定义元类,拦截类的信息,改变类的创建过程

class A:
    pass


# 自定义元类,需要继承type
class MyType(type):
    # args[0]: 父类元组列表
    # args[1]:类成员字典
    def __new__(cls, *args, **kwargs):
        args = list(args)
        # print(args)
        args[0] = 'MyType'  # 修改类名
        args[1] = (A,)  # 修改父类元组列表
        args[2]['__doc__'] = '修改类注释'
        args[2]['show'] = lambda self: print('添加类方法')
        return type(args[0], args[1], args[2])


class Person(object, metaclass=MyType):
    """
        Person--类注释
    """
    PI = 3.14

    def __init__(self, name):
        self.name = name


print(Person.__dict__)
print(Person.__doc__)  # 修改类注释
print(Person.__bases__)  # (<class '__main__.A'>,)
print(Person.__name__)  # MyType
p = Person('张三')
p.show()  # 添加类方法

pickle序列化

json:跨平台,适用于不同语言,序列化为字符串, 公开传输
pickle: python专用, 序列化为二进制, 不公开传输,可以序列化自定义的对象

序列化

import pickle

datas = [{'name': '张三', 'age': 20}, {'name': 'mary', 'age': 30}]


b = pickle.dumps(datas)
print(b)  # 字节

反序列化

print(pickle.loads(b))  # [{'name': '张三', 'age': 20}, {'name': 'mary', 'age': 30}]

with open('./datas.txt', 'wb') as f:
    pickle.dump(datas, f)

with open('./datas.txt', 'rb') as f:
    # print(pickle.load(f))  # [{'name': '张三', 'age': 20}, {'name': 'mary', 'age': 30}]
    print(pickle.load(f)[0])  # {'name': '张三', 'age': 20}

序列化升级

pickle可以直接序列化自定义对象
pickle反序列化的结果任然是对象

import json
import pickle
from json import JSONEncoder, JSONDecoder


class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age


datas = [Student('张三', 18), Student('李四', 28)]

# pickle可以直接序列化自定义对象
s = pickle.dumps(datas)
print(s)
# pickle反序列化的结果任然是对象
s1 = pickle.loads(s)
print(s1)
# print(s1[0].__dict__)  # {'name': '张三', 'age': 18}


# json序列化自定义对象
# s = json.dumps(datas, ensure_ascii=False, default=lambda o: {'name': o.name, 'age': o.age})
s = json.dumps(datas, ensure_ascii=False, default=lambda o: o.name)
print(s)  # ["张三", "李四"]
class MyJSONEncoder(JSONEncoder):
    def default(self, o):
        return {'name': o.name, 'age': o.age}


s = json.dumps(datas, ensure_ascii=False, cls=MyJSONEncoder)
print(s)


class MyJSONDecoder(JSONDecoder):
    def decode(self, s):
        s = json.loads(s)
        return [Student(item.get('name'), item.get('age')) for item in s]


b = json.loads(s, cls=MyJSONDecoder)
print(b)
print(b[0].__dict__)  # {'name': '张三', 'age': 18}
print(b[0].name)  # 张三

标签:__,name,Python,self,元类,Person,print,序列化
From: https://blog.csdn.net/2201_75539182/article/details/143817893

相关文章

  • 重生之我在Python中计算圆的周长和面积(第三章)
     ‘系统,你便用这些来搪塞朕吗,你寄身于孤,也要拿出些诚意来!’听到我的话,系统不禁打了个寒颤‘这世上竟有和我讨价还价的宿主,也罢,如今也是有求于他,便再展示一般吧!’系统内心不禁感慨随后荧光乍现,又一串神秘数字出现在眼前(不二家.jdp)             ......
  • python-5-常用模块
    python-5-常用模块什么是模块?  常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。  但其实import加载的模块分为四个通用类别:1使用python编写的代码(.py文件)2已被编译为共享库或DLL的C或C++扩展3包好一组模......
  • Python 入门(小白版)の7个基础代码 @Kerin森森
    Python,据说是很好入门的一门编程语言,so它也变成了0基础的我(@Kerin森森)的入门选择,在这里分享一下自己的一些学习记录and心得吧。如果你也和我一样是初学者,那就跟森森一起学习一起进步吧!1.第一个Python程序:HelloWorld每个程序员的旅程几乎都是从打印“Hello,World!”开始的......
  • 【python系列】python数据类型之列表
    一、什么是列表在Python中,列表(List)是一种用于存储有序数据的容器。它的特性包括:有序性:列表中的元素有固定的顺序。可变性:可以修改列表中的元素。支持任意数据类型:列表中的元素可以是数字、字符串、布尔值,甚至是其他列表。通过索引访问:列表使用从0开始的索引定位元素......
  • 【python图解】Python 数据结构之列表和元组
    【python图解】Python数据结构之列表和元组顾名思义,数据结构是能够将数据组合在一起的一种结构。在数学中,很多情况下需要将数据进行有序排列。例如我们统计了某班50人的数据成绩,那么一共50个人。例如Alice=99,Bob=86....无疑是非常繁琐的。这时我们可以通过数......
  • 利用 Python 和 Selenium 高效启动和管理 Chrome 浏览器
    在自动化测试和网页抓取的过程中,Selenium是最常用的工具之一。其强大的功能可以与浏览器无缝集成,实现复杂的操作。然而,为了提高效率和扩展性,尤其在处理大量任务时,我们可以通过定制化的方法启动Chrome浏览器并与Selenium驱动连接。本文将详细解析两段关键代码,实现以下目标:......
  • 《Python游戏编程入门》注-第7章
    《Python游戏编程入门》第7章“用精灵实现动画:EscapetheDragon游戏”中通过pygame.sprite模块(精灵)实现了动画效果。1通过精灵实现动画“7.2使用Pygame精灵”中实现了飞龙飞翔的效果,如图1所示。图1飞龙飞翔的效果注意1相关代码及资源,请参考《Python游戏编程入门注-第......
  • 计算机毕业设计源码 python基于爬虫的毕业生兴趣与求职实时智能数据分析
    标题:python基于爬虫的毕业生兴趣与求职实时智能数据分析设计一个基于Python和爬虫技术的毕业生兴趣与求职实时智能数据分析系统,可以帮助高校、企业和毕业生更好地了解就业市场趋势、毕业生兴趣和求职需求,从而优化招聘策略和个人职业规划。以下是一个典型的数据分析系统的主......
  • 计算机毕设设计项目源码 python基于Spark的淘宝服装数据分析系统的设计与实现
    标题:python基于Spark的淘宝服装数据分析系统的设计与实现设计一个基于Python和Spark的淘宝服装数据分析系统,可以帮助商家和平台更好地了解市场趋势、消费者偏好和销售情况,从而优化库存管理和营销策略。以下是一个典型的数据分析系统的主要功能模块:1.系统概述•目标:为淘宝......
  • 【人工智能】Python在机器学习与人工智能中的应用
    Python因其简洁易用、丰富的库支持以及强大的社区,被广泛应用于机器学习与人工智能(AI)领域。本教程通过实用的代码示例和讲解,带你从零开始掌握Python在机器学习与人工智能中的基本用法。1.机器学习与AI的Python生态系统Python拥有多种支持机器学习和AI的库,以下是几个核心库:......