一、Python对象体系概述
1.1 什么是"一切皆对象"?
定义:Python中所有数据类型(包括数字、字符串、函数、模块等)都以对象形式存在
数字、字符串、列表、函数、类、模块等都是对象
所有对象都有类型(type)和唯一标识(id)
所有对象都可以被赋值给变量、作为参数传递或作为返回值
所有对象都支持某些操作(如属性访问、方法调用)类比:Python世界是一个大仓库,每个对象都是仓库中的包裹(有独立地址、标签和内容)
1.2 对象三要素(对象身份证)
1.3 对象与引用的关系
Python中的变量实际上是对象的引用:
赋值操作创建引用而非复制对象
多个变量可以引用同一个对象
is操作符比较对象身份(内存地址)
==操作符比较对象值
a = [1, 2, 3]
b = a # b引用同一个列表对象
c = [1, 2, 3] # 创建新列表对象
print(a is b) # True
print(a is c) # False
print(a == c) # True
a.append(4)
print(b) # [1, 2, 3, 4] - b看到的变化
print(c) # [1, 2, 3] - c不受影响
1.4 可变 vs 不可变对象
内存变化对比:
# 不可变对象示例
a = 10
print(id(a)) # 140736053263712
a += 1
print(id(a)) # 140736053263744 地址改变
# 可变对象示例
lst = [1,2]
print(id(lst)) # 2214160327744
lst.append(3)
print(id(lst)) # 2214160327744 地址不变
表-对象可变性分类表:
2.2 对象生命周期
二、常用内置函数
2.1 类型操作函数type()
def type(object) -> type
功能:返回对象的类型
示例:
num = 42
print(type(num)) # <class 'int'>
lst = [1, 2, 3]
print(type(lst)) # <class 'list'>
isinstance()
def isinstance(obj, classinfo) -> bool
功能:检查对象是否为指定类的实例
参数:
classinfo:类对象或类型元组示例:
data = 3.14
if isinstance(data, (int, float)):
print("Valid number")
表-类型检查函数对比
2.2 属性操作函数
dir()
def dir([object]) -> list
功能:返回对象的有效属性列表
示例:
class Car:
def __init__(self):
self.speed = 0
my_car = Car()
print(dir(my_car)) # 包含speed属性
dir()函数输出示意
['__class__', '__delattr__', ..., 'speed']
getattr()
def getattr(object, name[, default]) -> any
功能:获取对象属性值
示例:
config = {'host': 'localhost', 'port': 8080}
value = getattr(config, 'get')('host', '127.0.0.1')
setattr() 动态设置
# 运行时添加属性
setattr(s, 'grade', 'A')
2.3 对象操作函数
id()
def id(object) -> int
功能:返回对象的内存地址
示例:
a = [1, 2]
b = a
print(id(a) == id(b)) # True
对象内存示意
变量栈 堆内存
a -----> 0x1001 [1,2]
b ----->
callable()
def callable(object) -> bool
功能:判断对象是否可调用
示例:
def greeting():
print("Hello!")
print(callable(greeting)) # True
print(callable(100)) # False
三、对象模型实践
3.1 函数即对象
def greet(name):
returnf"Hello, {name}!"
# 函数作为对象操作
print(greet("Alice")) # 正常调用
print(type(greet)) # <class 'function'>
print(id(greet)) # 函数对象的内存地址
print(dir(greet)) # 查看函数对象的属性和方法
# 函数可以被赋值
say_hello = greet
print(say_hello("Bob")) # Hello, Bob!
# 函数可以作为参数
defapply_func(func, arg):
return func(arg)
print(apply_func(greet, "Charlie")) # Hello, Charlie!
# 函数可以作为返回值
defcreate_greeter(greeting):
defgreeter(name):
returnf"{greeting}, {name}!"
return greeter
morning_greet = create_greeter("Good morning")
print(morning_greet("David")) # Good morning, David!
3.2 类也是对象
# 类定义实际上创建了一个类对象
classPerson:
def__init__(self, name):
self.name = name
defsay_hello(self):
returnf"{self.name} says hello!"
print(type(Person)) # <class 'type'>
print(isinstance(Person, type)) # True
# 类可以被动态修改
Person.species = "Homo sapiens"
print(Person.species) # Homo sapiens
# 类可以作为参数传递
defdescribe_class(cls):
print(f"Class name: {cls.__name__}")
print(f"Bases: {cls.__bases__}")
print(f"Attributes: {dir(cls)}")
describe_class(Person)
# 动态创建类
Dog = type('Dog', (), {'bark': lambdaself: "Woof!"})
d = Dog()
print(d.bark()) # Woof!
3.3 模块即对象
import math
print(type(math)) # <class 'module'>
print(dir(math)) # 显示模块所有成员
四、编程实践
4.1 动态属性管理示例
class ConfigLoader:
def __init__(self, config_dict):
for key, value in config_dict.items():
setattr(self, key, value)
config = ConfigLoader({'debug': True, 'timeout': 30})
print(config.debug) # True
4.2 函数式编程示例
from functools import partial
def power(base, exp):
return base ** exp
square = partial(power, exp=2)
cube = partial(power, exp=3)
print(square(5)) # 25
print(cube(3)) # 27
4.3 对象工厂模式示例
class ShapeFactory:
@staticmethod
defcreate_shape(shape_type):
if shape_type == "circle":
return Circle()
elif shape_type == "square":
return Square()
else:
raise ValueError("未知形状")
classCircle: pass
classSquare: pass
shape = ShapeFactory.create_shape("circle")
五、注意事项
避免滥用isinstance检查类型,优先使用鸭子类型
使用dir()调试时注意魔法方法
getattr()设置默认值防止AttributeError
大对象使用id()可能引发内存问题
六、"一切皆对象"的优势
一致性:统一的操作模型简化了语言设计
灵活性:对象可以动态创建、修改和传递
可扩展性:通过魔术方法和协议支持各种行为
内省能力:运行时可以检查和修改对象结构
通过理解Python对象模型,结合标准库和第三方库的灵活使用,可以充分发挥Python的动态特性,编写出简洁高效的Pythonic代码。
七、常见问题
Q1:Python中同一个整数是同一个对象吗?
a = 256
b = 256
print(a is b) # True 小整数池优化
c = 257
d = 257
print(c is d) # False 超出优化范围
Q2:函数作为参数传递的原理是什么?
graph LR
A[函数定义] --> B[创建函数对象]
C[调用函数] --> D[传递对象引用]
Q3:如何理解"Python没有变量只有名字"?
x = 10 # 名字x绑定到整数对象10
x = "hello" # 重新绑定到字符串对象
八、知识图谱总结
通过全面理解Python的对象模型,我们可以:
编写更高效的代码
实现灵活的设计模式
创造优雅的Pythonic解决方案
更新日期:2025-05-16
交流讨论:欢迎在评论区留言!
重要提示:本文主要是记录自己的学习与实践过程,所提内容或者观点仅代表个人意见,只是我以为的,不代表完全正确,不喜请勿关注。
领取专属 10元无门槛券
私享最新 技术干货