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