python的映射_一文读懂Python中的映射

本文深入讲解了Python中反射机制的基本概念及其应用场景。介绍了通过hasattr、getattr、setattr和delattr等内置函数操作对象属性的方法,并提供了多个实例演示如何利用反射功能进行动态编程。

python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。

获取成员: getattrclass Foo:

def __init__(self, name, age):

self.name = name

self.age = age

obj = Foo('klvchen', 18)

inp = input('>>>')

v = getattr(obj, inp)

print(v)

运行结果:>>>name

klvchenclass Foo:

def __init__(self, name, age):

self.name = name

self.age = age

def show(self):

return "%s-%s" %(self.name, self.age)

obj = Foo('klvchen', 18)

func = getattr(obj, 'show')

print(func)

res = func()

print(res)

运行结果:>

klvchen-18

检查是否含有成员: hasattrclass Foo:

def __init__(self, name, age):

self.name = name

self.age = age

def show(self):

return "%s-%s" %(self.name, self.age)

obj = Foo('klvchen', 18)

print(hasattr(obj, 'name1'))

运行结果:False

设置成员: setattrclass Foo:

def __init__(self, name, age):

self.name = name

self.age = age

def show(self):

return "%s-%s" %(self.name, self.age)

obj = Foo('klvchen', 18)

# print(hasattr(obj, 'name1'))

setattr(obj, 'key', 'value')

print(obj.key)

运行结果:value

删除成员: delattrclass Foo:

def __init__(self, name, age):

self.name = name

self.age = age

def show(self):

return "%s-%s" %(self.name, self.age)

obj = Foo('klvchen', 18)

print(obj.name)

delattr(obj, 'name')

print(obj.name)

运行结果:klvchen

AttributeError: 'Foo' object has no attribute 'name'

通过字符串的形式操作对象中的成员class Foo:

stat = '666'

def __init__(self, name, age):

self.name = name

self.age = age

res = getattr(Foo, 'stat')

print(res)

运行结果:666

创建两个文件,s1.py 和 s2.py

s2.py 内容如下:NAME = 'klvchen'

def func():

return 'func'

s1.py 内容如下:import s2

res1 = getattr(s2, 'NAME')

print(res1)

res2 = getattr(s2, 'func')

result = res2()

print(result)

运行 s1.py 文件:klvchen

func

创建两个文件,s1.py 和 s2.py

s2.py 内容如下:NAME = 'klvchen'

def func():

return 'cwe'

class Foo:

def __init__(self):

self.name = 666

s1.py 内容如下:import s2

res1 = getattr(s2, 'NAME')

print(res1)

res2 = getattr(s2, 'func')

result = res2()

print(result)

cls = getattr(s2, 'Foo')

print(cls)

obj = cls()

print(obj)

print(obj.name)

运行 s1.py 文件,运行结果:klvchen

cwe

666

创建两个文件,s1.py 和 s2.py

s2.py 内容如下:def f1():

return '首页'

def f2():

return '新闻'

def f3():

return '精华'

s1.py 内容如下:import s2

inp = input('请输入要查看的URL: ')

if hasattr(s2, inp):

func = getattr(s2, inp)

result = func()

print(result)

else:

print('404')

运行 s1.py 文件,运行结果:请输入要查看的URL: f1

首页

### DBC 文件详解 DBC(Data Base Container)文件是一种二进制数据存储格式,广泛应用于游戏开发领域,尤其是暴雪娱乐的游戏引擎中。以下是关于 DBC 文件的用途、结构以及如何使用的详细介绍。 --- #### **一、DBC 文件的用途** DBC 文件的主要目的是以一种高效的方式存储和管理大量静态数据。这种文件常用于游戏中配置项的数据存储,例如物品属性、技能描述、NPC信息等。由于其紧凑性和易读性,DBC 文件成为许多复杂系统的理想选择[^2]。 - 游戏中的物品、技能和其他资源可以通过 DBC 文件进行统一管理和分发。 - 提供了一种标准化的方式来定义和维护游戏内的各种参数。 --- #### **二、DBC 文件的结构** DBC 文件具有严格的结构化设计,便于程序快速解析和加载。以下是其主要组成部分: 1. **头部信息** - 版本声明 (`VERSION`):标明当前 DBC 文件的具体版本号,有助于追踪修改历史并确保兼容性[^1]。 - 新符号段 (`NS_` 或 `New Symbol`):允许扩展新的关键字而不破坏原有逻辑,增强了灵活性和向后兼容能力[^1]。 2. **波特率定义 (BS_)** 这一部分通常用来设定通信协议的相关速率或其他初始化参数,尽管并非所有场景都需要此字段[^1]。 3. **记录区** 记录区内包含了多个条目,每一条目对应一组具体的数值或字符串。这些条目的排列方式遵循固定的偏移量规则,方便随机访问任意位置的内容。 4. **索引表** 如果启用了索引功能,则会在文件末尾附加一张映射表格,加速查找过程。 --- #### **三、DBC 文件的使用方法** 要有效地利用 DBC 文件,可以按照以下流程操作: 1. **创建与编辑** 使用专门工具或者脚本来生成初始版 DBC 文档。例如,某些第三方插件提供了图形界面让用户轻松输入各项细节[^3]。 2. **转换处理** 将原始形式转化为更适合目标平台的形式,比如 Excel 表格以便于人工校验,然后再反编译回标准 DBC 格式。 3. **集成部署** 把最终产物嵌入至应用程序内部,并编写相应的驱动代码实现动态加载与查询等功能。 下面展示一段简单的 Python 脚本示例来演示如何解析基本的 DBC 数据流: ```python import struct def parse_dbc(file_path): with open(file_path, 'rb') as f: header_size = struct.unpack('<I', f.read(4))[0] record_count = struct.unpack('<I', f.read(4))[0] field_count = struct.unpack('<I', f.read(4))[0] records = [] for _ in range(record_count): fields = [] for __ in range(field_count): value = struct.unpack('<f', f.read(4))[0] # 假设字段均为浮点数类型 fields.append(value) records.append(fields) return records result = parse_dbc('example.dbc') print(result[:5]) # 输出前五条记录作为样本验证 ``` --- #### **四、总结** 综上所述,DBC 文件凭借其独特的架构优势,在现代软件工程特别是大型网络游戏制作过程中扮演着不可或缺的角色。无论是从理论层面还是实践角度出发,掌握这一知识点都将极大地提升工作效率和技术水平。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值