深入了解python中元类和连接符的用法

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 【6月更文挑战第20天】本文介绍包括`type`的多重用途,内建函数的常量,模块属性,类继承的概念,元类的工作原理,可哈希对象的重要性,加权平均值的计算,以及如何找到两个列表的交集。

简介

  • type 元类:用于判断对象类型、动态创建类和作为所有对象的父类。
  • 内建函数:包括 True, False, None, Ellipsis, NotImplemented 等常量,以及 __import__ 和元编程功能。
  • dir(__builtins__) 显示内建模块属性,如 __name__, __doc__ 等。
  • 类继承:通过 type 动态创建子类,如 type Child ;, (Parent,), { method : lambda: })
  • 元类:控制类的创建,通过 __metaclass__ 指定。
  • 可哈希对象:用于字典键,如整数、浮点数、字符串、元组和 frozensets,必须不可变。
  • 权重平均:使用列表推导式计算加权平均值。
  • 交集:通过 filterset 计算两个列表的交集。

Toroid托瑞德符号.png

1 type 元类

3个用法

  • 1,判断对象类型

    type(2)

    int

    type('a')

    string

  • 2, 动态创建类

接收一个类的描述符作为参数,然后返回一个类

type(类名,父类元组(针对继承的场景,可以为空),包含属性的字典(名称和值))

class myclass:
    pass

等价与

  mySingClass = type('myclass', (), {})

其他例子

Foo = type('Foo', (), {'bar':True})
  • 3 type 类工厂

    type 是所有object对象的父类

    所有对象都继承自object,所有类都继承自type

type可用于动态创建新类的内置函数。

1),如果给定参数,则返回参数的类型

    type(1)
        <class 'int'>

2),如果给定3个参数 name,bases,dict,它将创建一个新类

name定义类的名称
bases定义基类,即超类
dict定义所有类属性和方法。

    clsas MyClass(MySuperClass):
        def x(self):
            print('x')

与此类相同

def x_function(self):
    print('x')
MyClass = type("MyClass", (MySuperClass,), {'x', x_function})

这是可实现collections.namedtuple类的一种方式,例如,它接收类名和属性元组。

2 内建函数

5个常量

True, False, None, Ellipsis 也可写为 ... 为了支持类型注释,以及一些花俏的切片支持。

NotImplemented 用于类的运算符定义,使得一个类不支持某些操作。

当您希望告诉python 为此类定义某个运算符时,使用它。

所有的python对象都可用通过在其类中定义的特殊方法添加对所有python运算符的重新定义
+=add + iadd +=

3 内建公共函数

print(dir(builtins))

模块属性

  • name # 模块名称

  • doc # 模块文档字符串

  • package # 该模块所属的包,对于顶级模块与name对于子模块 它是包的name

  • spec # 指模块规范,它包含元数据,模块名称,什么类型以及它是如何创建 加载的

  • loader # 设置为加载模块时导入机制使用的加载器对象,特定在 _frozen_importlib模块定义

  • import # 是定义导入语句如何在python工作的内置函数,在内部是python对import语句所做的

  • debug # #python的全局常量值,总是设置为 True,python在调试模式运行。

  • -o 在优化模式,阻止断言语句做任何事情。

  • debug True False None 是 python真正的常量,不能被更改

  • build_class # 允许类定义接收任意位置和 关键字参数,涉及元类问题

        类创建语法只允许传递要继承的基类和元类属性。
    新要求是允许可变数量的位置和关键字参数。添加到语言中会有点混乱和复杂。
    
  • cached # 导入模块时,该属性存储该模块的已编译python __cached的缓存文件路径

4 使用type 继承

普通继承方式

class chindFoo(Foo):
    pass

使用type方式继承

typeChindFoo = type('typeChindFoo', (Foo,), {'chind_foo':'chindFoo'})
print(typeChindFoo().chind_foo)
    'chindFoo'
hasattr(typeChindFoo, "chind_foo")
    True

对象属性保存在 class

foo.__class__.__class__
    <type 'type'>

5 自定义元类

  • metaclass

    python创建类时,先在当前定义中寻找 metaclass,如果有就使用 metaclass 创建类
    如果没有 ,那么就在 父类中寻找 metaclass, 父类都没有,则在模块中寻找metaclass

    如果都找不到,python将使用 type创建这个类

    在创建类时 把属性都改为大写的

6 可hash/散列的 对象

字典的key 应该是hashable。这就是为什么我们总是使用可散列对象作为键。

可散列对象是整数、浮点数、字符串、元组和frozensets

可散列对象也是不可变对象

可变对象: 列表,字典,集合。

7 两个列表的加权平均

权重

     weight = [0.5, 0.8, 0.7, 0.8, 1.0]

  values = [10, 20, 10, 10, 30]

平均值

 s = sum ( [ weight[i] * values[i] for i in range(len(weight)) ] )/ sum (values)

 zip_average = sum ( [ x * y for x,y in zip ( weights , values ) ] ) / sum (values)

打印平均值,

    print(zip_average) # 0.825 0.825

8 推导式:两个列表的交集

filter 和列表推导式

 a = [1,2,3,5,7,9]
 b = [2,3,5,6,7,8]
 print(filter(lambda x: x in a, b)) # 打印出 [2, 3, 5, 7]

或使用set 计算两个列表的合集

 list(set(a) & set(b))

小结

本文介绍包括type的多重用途,内建函数的常量,模块属性,类继承的概念,元类的工作原理,可哈希对象的重要性,加权平均值的计算,以及如何找到两个列表的交集。

目录
相关文章
|
13天前
|
缓存 监控 程序员
Python中的装饰器是一种特殊类型的声明,它允许程序员在不修改原有函数或类代码的基础上,通过在函数定义前添加额外的逻辑来增强或修改其行为。
【6月更文挑战第30天】Python装饰器是无侵入性地增强函数行为的工具,它们是接收函数并返回新函数的可调用对象。通过`@decorator`语法,可以在不修改原函数代码的情况下,添加如日志、性能监控等功能。装饰器促进代码复用、模块化,并保持源代码整洁。例如,`timer_decorator`能测量函数运行时间,展示其灵活性。
18 0
|
10天前
|
存储 JSON 测试技术
python中json和类对象的相互转化
针对python中类对象和json的相关转化问题, 本文介绍了4种方式,涉及了三个非常强大的python库jsonpickle、attrs和cattrs、pydantic,但是这些库的功能并未涉及太深。在工作中,遇到实际的问题时,可以根据这几种方法,灵活选取。 再回到结构化测试数据的构造,当需要对数据进行建模时,也就是赋予数据业务含义,pydantic应该是首选,目前(2024.7.1)来看,pydantic的生态非常活跃,各种基于pydantic的工具也非常多,建议尝试。
|
17天前
|
算法 Python
Python新式类和经典类
Python新式类和经典类
|
19天前
|
安全 测试技术 Python
Python类中的Setter与Getter:跨文件调用的艺术
Python类中的Setter与Getter:跨文件调用的艺术
16 3
|
3天前
|
Python
关于Python的类的一些理解
关于Python的类的一些理解
|
3天前
|
存储 算法 索引
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
|
7天前
|
设计模式 Python
深度揭秘!Python元类:掌握它,让你的代码拥有创造类的能力
【7月更文挑战第6天】Python元类探秘:**元类是类的类,用于控制类的创建。通过定义元类,可自定义类的行为,如动态添加方法或改变继承结构。示例中,`my_metaclass`在创建类时添加`new_method`。元类强大且适用于高级编程,如动态修改、注册类或实现设计模式。理解并善用元类能提升Python编程技巧。
16 0
|
9天前
|
Python
Python 中 decimal 模块的用法教程
Python 中 decimal 模块的用法教程
9 0
|
14天前
|
Python
python之requests基础用法
python之requests基础用法
|
16天前
|
Python
经验大分享:python类函数,实例函数,静态函数
经验大分享:python类函数,实例函数,静态函数
12 0