一、object:所有类的"终极基类"
1.1 基础特性:python的类基础
object类是所有python类的基类,提供了所有类实例共有的基本方法。
# 创建基础对象实例
base_obj = object()
print(f"对象类型: {type(base_obj)}") # 输出: <class 'object'>
print(f"对象标识: {id(base_obj)}")
print(f"对象哈希: {hash(base_obj)}")
# 验证object实例特性
print(f"是否有__dict__: {hasattr(base_obj, '__dict__')}") # 输出: false
print(f"是否有__slots__: {hasattr(base_obj, '__slots__')}") # 输出: false
# 尝试添加属性会失败
try:
base_obj.custom_attr = "测试值"
print("添加属性成功")
except attributeerror as e:
print(f"添加属性失败: {e}") # 输出: 'object' object has no attribute 'custom_attr'
# 基本方法演示
print(f"对象字符串表示: {str(base_obj)}")
print(f"对象正式表示: {repr(base_obj)}")
print(f"对象等于自身: {base_obj == base_obj}") # 输出: true
1.2 实际应用:创建轻量级基类
class lightweightbase(object):
"""轻量级基类,使用__slots__减少内存占用"""
__slots__ = ('x', 'y') # 明确指定可用的属性
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __repr__(self):
return f"lightweightbase(x={self.x}, y={self.y})"
def move(self, dx, dy):
"""移动位置"""
self.x += dx
self.y += dy
return self
# 使用示例
point = lightweightbase(3, 4)
print(f"创建点: {point}")
print(f"点坐标: ({point.x}, {point.y})")
# 移动点
point.move(2, -1)
print(f"移动后: {point}")
# 验证属性限制
print(f"是否有__dict__: {hasattr(point, '__dict__')}") # 输出: false
print(f"是否有__slots__: {hasattr(point, '__slots__')}") # 输出: true
# 无法添加未在__slots__中定义的属性
try:
point.z = 5
print("添加属性成功")
except attributeerror as e:
print(f"添加属性失败: {e}")
# 对比普通类和轻量级类的内存使用
class normalclass:
def __init__(self, x, y):
self.x = x
self.y = y
import sys
normal_obj = normalclass(1, 2)
lightweight_obj = lightweightbase(1, 2)
print(f"普通对象大小: {sys.getsizeof(normal_obj) + sys.getsizeof(normal_obj.__dict__)} 字节")
print(f"轻量对象大小: {sys.getsizeof(lightweight_obj)} 字节")
二、oct():八进制转换的"翻译器"
2.1 基础用法:整数转八进制字符串
oct()函数将整数转换为带"0o"前缀的八进制字符串,是进制转换的重要工具。
# 基本八进制转换
print(f"8的八进制: {oct(8)}") # 输出: '0o10'
print(f"10的八进制: {oct(10)}") # 输出: '0o12'
print(f"16的八进制: {oct(16)}") # 输出: '0o20'
# 负数转换
print(f"-56的八进制: {oct(-56)}") # 输出: '-0o70'
print(f"0的八进制: {oct(0)}") # 输出: '0o0'
# 大整数转换
large_num = 2**20
print(f"2^20的八进制: {oct(large_num)}")
# 从十六进制数转换
hex_num = 0xff
print(f"0xff的八进制: {oct(hex_num)}") # 输出: '0o377'
# 使用__index__方法的对象
class indexablenumber:
def __index__(self):
return 100
custom_obj = indexablenumber()
print(f"自定义对象转换: {oct(custom_obj)}") # 输出: '0o144'
2.2 实际应用:文件权限和进制转换工具
class permissionconverter:
"""权限转换工具类(常用于linux文件权限)"""
@staticmethod
def chmod_to_octal(permission_str):
"""将chmod权限字符串转换为八进制数字"""
if len(permission_str) != 9:
raise valueerror("权限字符串必须是9个字符")
# 权限映射:r=4, w=2, x=1
perms = {'r': 4, 'w': 2, 'x': 1, '-': 0}
# 每3位一组转换为八进制
result = 0
for i in range(0, 9, 3):
group = permission_str[i:i+3]
value = 0
for char in group:
if char in perms:
value += perms[char]
else:
raise valueerror(f"无效权限字符: {char}")
result = result * 10 + value # 注意:这里构建的是十进制数,但每位代表八进制值
return int(str(result), 8) # 将字符串解析为八进制整数
@staticmethod
def octal_to_chmod(octal_permission):
"""将八进制权限转换为chmod字符串"""
# 确保是有效的八进制权限(0-777)
if not 0 <= octal_permission <= 0o777:
raise valueerror("权限必须在0-777范围内")
permission_str = ""
# 转换为三位八进制字符串
oct_str = oct(octal_permission)[2:].zfill(3)
for digit in oct_str:
value = int(digit, 8)
# 转换为rwx格式
bits = [
'r' if value & 4 else '-',
'w' if value & 2 else '-',
'x' if value & 1 else '-'
]
permission_str += ''.join(bits)
return permission_str
@staticmethod
def format_octal_number(num, width=0, prefix=true):
"""格式化八进制输出"""
if prefix:
oct_str = oct(num)
else:
oct_str = format(num, 'o')
if width > 0:
# 处理前缀
if prefix and oct_str.startswith('0o'):
oct_str = '0o' + oct_str[2:].zfill(width)
elif prefix and oct_str.startswith('-0o'):
oct_str = '-0o' + oct_str[3:].zfill(width)
elif oct_str.startswith('-'):
oct_str = '-' + oct_str[1:].zfill(width)
else:
oct_str = oct_str.zfill(width)
return oct_str
# 使用示例
converter = permissionconverter()
# 文件权限转换
print("=== 文件权限转换示例 ===")
permission_str = "rwxr-xr--"
octal_perm = converter.chmod_to_octal(permission_str)
print(f"权限 '{permission_str}' -> 八进制: {oct(octal_perm)}")
# 反向转换
converted_back = converter.octal_to_chmod(octal_perm)
print(f"八进制 {oct(octal_perm)} -> 权限: {converted_back}")
# 常见权限示例
common_permissions = {
"完全开放": 0o777, # rwxrwxrwx
"用户读写执行,组只读,其他无": 0o740, # rwxr-----
"用户读写,组只读,其他只读": 0o644, # rw-r--r--
"仅用户读写": 0o600, # rw-------
}
for name, perm in common_permissions.items():
perm_str = converter.octal_to_chmod(perm)
print(f"{name}: {oct(perm)} -> {perm_str}")
# 八进制格式化
test_numbers = [8, 10, 16, 100]
for num in test_numbers:
formatted = converter.format_octal_number(num, width=4, prefix=true)
print(f"{num} 的八进制: {formatted}")
三、ord():字符编码的"解码器"
3.1 基础用法:获取字符的unicode码位
ord()函数返回字符的unicode码位(整数),是字符编码处理的基础。
# 基本ascii字符
print(f"'a'的码位: {ord('a')}") # 输出: 97
print(f"'a'的码位: {ord('a')}") # 输出: 65
print(f"'0'的码位: {ord('0')}") # 输出: 48
print(f"' '的码位: {ord(' ')}") # 输出: 32(空格)
# 特殊字符
print(f"'€'的码位: {ord('€')}") # 输出: 8364(欧元符号)
print(f"'中'的码位: {ord('中')}") # 输出: 20013
print(f"'☆'的码位: {ord('☆')}") # 输出: 9734
# 控制字符
print(f"'\\n'的码位: {ord('\\n')}") # 输出: 10(换行符)
print(f"'\\t'的码位: {ord('\\t')}") # 输出: 9(制表符)
# 字节对象(单字节)
print(f"b'a'的码位: {ord(b'a')}") # 输出: 97
print(f"b'\\x41'的码位: {ord(b'\\x41')}") # 输出: 65(ascii 'a')
# bytearray对象
ba = bytearray(b'x')
print(f"bytearray的码位: {ord(ba)}") # 输出: 88
3.2 实际应用:字符编码分析和转换
class characteranalyzer:
"""字符分析工具类"""
@staticmethod
def analyze_string(text):
"""分析字符串中所有字符的编码信息"""
results = []
for i, char in enumerate(text):
code_point = ord(char)
results.append({
'index': i,
'character': char,
'codepoint': code_point,
'hex': hex(code_point),
'binary': bin(code_point),
'category': characteranalyzer.get_char_category(char)
})
return results
@staticmethod
def get_char_category(char):
"""获取字符类别"""
code = ord(char)
if 0 <= code <= 31:
return "控制字符"
elif 32 <= code <= 126:
return "ascii可打印字符"
elif 127 <= code <= 255:
return "扩展ascii"
elif 256 <= code <= 65535:
return "基本多文种平面(bmp)"
else:
return "补充平面"
@staticmethod
def string_to_codepoints(text, format='decimal'):
"""将字符串转换为码点序列"""
codepoints = [ord(c) for c in text]
if format == 'decimal':
return codepoints
elif format == 'hex':
return [hex(cp) for cp in codepoints]
elif format == 'binary':
return [bin(cp) for cp in codepoints]
else:
return codepoints
@staticmethod
def codepoints_to_string(codepoints):
"""将码点序列转换回字符串"""
return ''.join(chr(cp) for cp in codepoints)
@staticmethod
def find_special_characters(text):
"""查找文本中的特殊字符"""
special_chars = []
for char in text:
cp = ord(char)
if cp < 32 or cp > 126: # 非标准ascii字符
special_chars.append({
'char': char,
'codepoint': cp,
'representation': repr(char)
})
return special_chars
# 使用示例
analyzer = characteranalyzer()
# 字符串分析
print("=== 字符串编码分析 ===")
test_text = "hello 世界! ☆"
analysis = analyzer.analyze_string(test_text)
for item in analysis:
print(f"位置 {item['index']}: '{item['character']}' -> "
f"码点 {item['codepoint']}, 十六进制 {item['hex']}, "
f"类别: {item['category']}")
# 码点转换
codepoints_decimal = analyzer.string_to_codepoints("abc", format='decimal')
codepoints_hex = analyzer.string_to_codepoints("abc", format='hex')
print(f"字符串码点(十进制): {codepoints_decimal}")
print(f"字符串码点(十六进制): {codepoints_hex}")
# 反向转换
original = analyzer.codepoints_to_string([72, 101, 108, 108, 111])
print(f"码点转字符串: {original}")
# 查找特殊字符
text_with_special = "hello\tworld\n中国☆"
special = analyzer.find_special_characters(text_with_special)
print(f"\n特殊字符查找:")
for item in special:
print(f" 字符: {item['representation']}, 码点: {item['codepoint']}")
四、组合应用:编码和权限系统
4.1 字符编码转换器
class encodingconverter:
"""编码转换器"""
@staticmethod
def text_to_unicode_escape(text):
"""将文本转换为unicode转义序列"""
result = []
for char in text:
cp = ord(char)
if 32 <= cp <= 126: # 可打印ascii字符
result.append(char)
else:
# 格式: \uxxxx 或 \uxxxxxxxx
if cp <= 0xffff:
result.append(f"\\u{cp:04x}")
else:
result.append(f"\\u{cp:08x}")
return ''.join(result)
@staticmethod
def unicode_escape_to_text(escape_str):
"""将unicode转义序列转换为文本"""
import re
def replace_match(match):
hex_str = match.group(1)
return chr(int(hex_str, 16))
# 处理\uxxxx和\uxxxxxxxx格式
pattern = r'\\[uu]([0-9a-fa-f]{4,8})'
return re.sub(pattern, replace_match, escape_str)
@staticmethod
def text_to_octal_escape(text, max_line_length=80):
"""将文本转换为八进制转义序列(类似c字符串)"""
result = []
line_length = 0
for char in text:
cp = ord(char)
escape_seq = f"\\{cp:03o}" # 八进制转义
result.append(escape_seq)
line_length += len(escape_seq)
if line_length >= max_line_length:
result.append("\n")
line_length = 0
return ''.join(result)
# 使用示例
converter = encodingconverter()
# unicode转义
text = "hello 世界! ☆"
escaped = converter.text_to_unicode_escape(text)
print(f"原始文本: {text}")
print(f"unicode转义: {escaped}")
# 反向转换
restored = converter.unicode_escape_to_text(escaped)
print(f"恢复文本: {restored}")
# 八进制转义
octal_escape = converter.text_to_octal_escape("abc\ntest")
print(f"八进制转义: {octal_escape}")
4.2 权限管理系统
class permissionsystem:
"""基于八进制的权限管理系统"""
def __init__(self):
self.permissions = {}
def add_user(self, username, base_permission=0o644):
"""添加用户并设置基础权限"""
if not 0 <= base_permission <= 0o777:
raise valueerror("权限值必须在0-777范围内")
self.permissions[username] = {
'permission': base_permission,
'roles': set()
}
return self.permissions[username]
def set_permission(self, username, permission):
"""设置用户权限"""
if username not in self.permissions:
raise keyerror(f"用户不存在: {username}")
if not 0 <= permission <= 0o777:
raise valueerror("权限值必须在0-777范围内")
self.permissions[username]['permission'] = permission
return permission
def check_permission(self, username, required_permission):
"""检查用户是否具有所需权限"""
if username not in self.permissions:
return false
user_perm = self.permissions[username]['permission']
# 将八进制权限分解为三组(用户、组、其他)
def split_permission(perm):
perm_str = oct(perm)[2:].zfill(3)
return [int(d) for d in perm_str]
user_parts = split_permission(user_perm)
required_parts = split_permission(required_permission)
# 检查用户权限是否满足要求
for u_perm, r_perm in zip(user_parts, required_parts):
# 检查每个位:读(4)、写(2)、执行(1)
if (u_perm & r_perm) != r_perm:
return false
return true
def add_role(self, username, role):
"""为用户添加角色"""
if username not in self.permissions:
raise keyerror(f"用户不存在: {username}")
self.permissions[username]['roles'].add(role)
return true
def has_role(self, username, role):
"""检查用户是否具有指定角色"""
if username in self.permissions:
return role in self.permissions[username]['roles']
return false
def display_permissions(self):
"""显示所有用户权限"""
print("用户权限列表:")
print("-" * 40)
print(f"{'用户名':<15} {'八进制':<8} {'字符串':<12} {'角色'}")
print("-" * 40)
for username, info in self.permissions.items():
perm = info['permission']
perm_str = self._permission_to_string(perm)
roles = ', '.join(info['roles']) if info['roles'] else '无'
print(f"{username:<15} {oct(perm):<8} {perm_str:<12} {roles}")
def _permission_to_string(self, permission):
"""将八进制权限转换为字符串表示"""
converter = permissionconverter()
return converter.octal_to_chmod(permission)
# 使用示例
print("=== 权限管理系统示例 ===")
system = permissionsystem()
# 添加用户
system.add_user("admin", 0o755) # rwxr-xr-x
system.add_user("editor", 0o644) # rw-r--r--
system.add_user("viewer", 0o444) # r--r--r--
system.add_user("tester", 0o777) # rwxrwxrwx
# 添加角色
system.add_role("admin", "administrator")
system.add_role("admin", "superuser")
system.add_role("editor", "content_manager")
system.add_role("viewer", "guest")
# 显示权限
system.display_permissions()
# 权限检查
print("\n权限检查:")
test_cases = [
("admin", 0o755), # 应该通过
("admin", 0o777), # 应该失败(admin没有写其他人的权限)
("editor", 0o644), # 应该通过
("viewer", 0o400), # 应该通过(有读权限)
("viewer", 0o200), # 应该失败(没有写权限)
]
for username, required_perm in test_cases:
has_perm = system.check_permission(username, required_perm)
perm_str = system._permission_to_string(required_perm)
print(f"用户 '{username}' 有权限 {oct(required_perm)} ({perm_str}): {has_perm}")
# 角色检查
print("\n角色检查:")
print(f"admin 是 administrator: {system.has_role('admin', 'administrator')}")
print(f"editor 是 administrator: {system.has_role('editor', 'administrator')}")
五、高级技巧与最佳实践
5.1 字符编码工具
class advancedcharactertools:
"""高级字符编码工具"""
@staticmethod
def create_character_table(start=32, end=126, columns=8):
"""创建字符编码表"""
print(f"字符编码表 ({start} 到 {end}):")
print("=" * 60)
print(f"{'十进制':<8} {'十六进制':<8} {'八进制':<8} {'字符':<8} {'名称':<20}")
print("-" * 60)
for code in range(start, end + 1):
if code % columns == 0 and code > start:
print() # 每columns个字符换行
char = chr(code)
print(f"{code:<8} {hex(code):<8} {oct(code):<8} "
f"'{char if code != 127 else 'del'!s:<8}' "
f"{advancedcharactertools.get_char_name(code):<20}")
@staticmethod
def get_char_name(code_point):
"""获取字符名称(简化版)"""
names = {
0: "null",
7: "bel", # 响铃
8: "bs", # 退格
9: "tab", # 制表符
10: "lf", # 换行
13: "cr", # 回车
27: "esc", # 退出
32: "space",# 空格
127: "del", # 删除
}
return names.get(code_point, "")
@staticmethod
def analyze_encoding_compatibility(text):
"""分析文本的编码兼容性"""
results = {
'ascii_compatible': true,
'latin1_compatible': true,
'utf8_size': 0,
'problematic_chars': []
}
for char in text:
cp = ord(char)
# ascii兼容性(0-127)
if cp > 127:
results['ascii_compatible'] = false
# latin-1兼容性(0-255)
if cp > 255:
results['latin1_compatible'] = false
# utf-8字节大小估计
if cp <= 0x7f:
results['utf8_size'] += 1
elif cp <= 0x7ff:
results['utf8_size'] += 2
elif cp <= 0xffff:
results['utf8_size'] += 3
else:
results['utf8_size'] += 4
# 记录控制字符(除常见外)
if cp < 32 and cp not in [9, 10, 13]: # tab, lf, cr
results['problematic_chars'].append({
'char': repr(char),
'codepoint': cp,
'name': advancedcharactertools.get_char_name(cp)
})
return results
# 使用示例
tools = advancedcharactertools()
# 创建字符表
tools.create_character_table(65, 90, 5) # 显示a-z
# 编码兼容性分析
test_texts = [
"hello world", # ascii
"café", # latin-1
"hello 世界", # 包含中文
"text with\ttab\nand newline", # 控制字符
]
for text in test_texts:
print(f"\n分析文本: {repr(text)}")
analysis = tools.analyze_encoding_compatibility(text)
for key, value in analysis.items():
if key != 'problematic_chars':
print(f" {key}: {value}")
if analysis['problematic_chars']:
print(f" 有问题的字符: {analysis['problematic_chars']}")
5.2 进制转换和优化
class numbersystemconverter:
"""进制系统转换器"""
@staticmethod
def convert_between_bases(number, from_base, to_base):
"""在任意进制间转换(2-36)"""
# 先转换为十进制
if isinstance(number, str):
decimal_val = int(number, from_base)
else:
decimal_val = int(str(number), from_base)
# 从十进制转换到目标进制
digits = "0123456789abcdefghijklmnopqrstuvwxyz"
if decimal_val == 0:
return "0"
result = []
is_negative = decimal_val < 0
decimal_val = abs(decimal_val)
while decimal_val > 0:
remainder = decimal_val % to_base
result.append(digits[remainder])
decimal_val //= to_base
if is_negative:
result.append('-')
return ''.join(reversed(result))
@staticmethod
def format_number_bases(number, bases=(2, 8, 10, 16)):
"""以多种进制格式化数字"""
results = {}
for base in bases:
if base == 2:
results['binary'] = bin(number)
elif base == 8:
results['octal'] = oct(number)
elif base == 10:
results['decimal'] = str(number)
elif base == 16:
results['hexadecimal'] = hex(number)
else:
results[f'base_{base}'] = numbersystemconverter.convert_between_bases(
number, 10, base
)
return results
@staticmethod
def create_conversion_table(numbers, max_num=20):
"""创建进制转换表"""
print(f"{'十进制':<8} {'二进制':<10} {'八进制':<8} {'十六进制':<8} {'字符'}")
print("-" * 45)
for num in numbers:
if 0 <= num <= max_num:
char_repr = repr(chr(num)) if 32 <= num <= 126 else '控制字符'
print(f"{num:<8} {bin(num):<10} {oct(num):<8} {hex(num):<8} {char_repr}")
# 使用示例
converter = numbersystemconverter()
# 进制间转换
print("进制间转换示例:")
print(f"二进制 '1010' -> 八进制: {converter.convert_between_bases('1010', 2, 8)}")
print(f"十六进制 'ff' -> 十进制: {converter.convert_between_bases('ff', 16, 10)}")
print(f"八进制 '77' -> 二进制: {converter.convert_between_bases('77', 8, 2)}")
# 多进制格式化
num = 255
formats = converter.format_number_bases(num, [2, 8, 10, 16, 5])
print(f"\n数字 {num} 的多种进制表示:")
for base_name, value in formats.items():
print(f" {base_name}: {value}")
# 创建转换表
print("\nascii字符编码表(部分):")
converter.create_conversion_table(range(65, 75)) # a-j
六、总结与实用建议
通过本文的详细解析,我们深入了解了python中三个重要的内置功能:
- object - 所有类的终极基类
- oct(integer) - 八进制转换的翻译器
- ord(character) - 字符编码的解码器
关键知识点总结:
object是所有python类的基类,实例没有__dict__属性oct()将整数转换为带"0o"前缀的八进制字符串ord()返回字符的unicode码位,支持字符串和字节对象
实用场景推荐:
- object:基类设计、内存优化、不可变对象
- oct():文件权限管理、进制转换、低级编程
- ord():字符编码分析、文本处理、国际化支持
最佳实践建议:
- 合理使用object:在需要内存优化时使用
__slots__,避免不必要的属性 - 理解进制转换:掌握二进制、八进制、十进制、十六进制的相互转换
- 处理字符编码:始终明确文本的编码方式,使用
ord()和chr()进行编码转换 - 异常处理:对用户输入进行验证,特别是进制转换和编码处理时
安全使用注意事项:
- 使用
oct()转换用户输入时验证数值范围 - 使用
ord()处理多字节字符时注意编码问题 - 在基类设计中合理使用属性限制
性能优化技巧:
- 使用
__slots__减少对象内存占用 - 对频繁的字符编码操作进行缓存
- 使用生成器处理大文本的字符分析
进阶学习方向:
- 深入学习python的unicode支持和编码问题
- 研究
__getattribute__()和__getattr__()等特殊方法 - 了解python的内存管理和垃圾回收机制
- 探索struct模块处理二进制数据
这三个功能虽然基础,但它们是python编程的重要基石。从面向对象设计到底层编码处理,从内存优化到权限管理,它们为各种编程场景提供了强大的支持。熟练掌握这些功能将帮助你编写出更加健壮、高效的python代码。
以上就是python内置函数object、oct()、ord()的实用指南的详细内容,更多关于python内置函数object、oct()、ord()的资料请关注代码网其它相关文章!
发表评论