python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python内置函数object、oct()、ord()

Python内置函数object、oct()、ord()的实用指南

作者:Python游侠

本文详细介绍了Python中的object类、oct()函数和ord()函数,分别作为所有类的基类、八进制转换工具和字符编码解码器,适用于基类设计、进制转换和字符编码处理等场景,需要的朋友可以参考下

一、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中三个重要的内置功能:

  1. object - 所有类的终极基类
  2. oct(integer) - 八进制转换的翻译器
  3. ord(character) - 字符编码的解码器

关键知识点总结:

实用场景推荐:

最佳实践建议:

  1. 合理使用object:在需要内存优化时使用__slots__,避免不必要的属性
  2. 理解进制转换:掌握二进制、八进制、十进制、十六进制的相互转换
  3. 处理字符编码:始终明确文本的编码方式,使用ord()chr()进行编码转换
  4. 异常处理:对用户输入进行验证,特别是进制转换和编码处理时

安全使用注意事项:

性能优化技巧:

进阶学习方向:

这三个功能虽然基础,但它们是Python编程的重要基石。从面向对象设计到底层编码处理,从内存优化到权限管理,它们为各种编程场景提供了强大的支持。熟练掌握这些功能将帮助你编写出更加健壮、高效的Python代码。

以上就是Python内置函数object、oct()、ord()的实用指南的详细内容,更多关于Python内置函数object、oct()、ord()的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文