如何为Matplotlib的Circle类扩展参数?实例化报错解决
解决Matplotlib自定义Circle子类初始化报错问题
错误原因
你在父类ptch.Circle的构造函数执行前,就给self.radius赋值。Circle的radius是带setter的属性,赋值时会触发set_radius方法,而此时父类继承的Artist类还未完成初始化,set_radius中访问self.stale时会调用get_animated(),但_animated属性还没被创建,因此抛出AttributeError。
修正后的代码
import matplotlib.pyplot as plt import matplotlib.patches as ptch import numpy as np import math import random class Particle(ptch.Circle): def __init__(self, center=np.array([0.5,0.5]), radius=1.0, color='#FFFFFF', mass=1, velocity=np.array([1,1]), acceleration=np.array([0,0])): # 优先调用父类构造函数,完成Artist和Circle的初始化 super().__init__(xy=(center[0], center[1]), radius=radius, color=color) # 再设置自定义的物理属性 self.mass = mass self.velocity = velocity self.acceleration = acceleration # 可选:拆分速度、加速度分量(也可以直接用数组访问) self.vx = velocity[0] self.vy = velocity[1] self.ax = acceleration[0] self.ay = acceleration[1] # 可选:存储中心坐标分量(父类已有self.center属性可直接用) self.rx = center[0] self.ry = center[1]
关键改动说明
- 先初始化父类:确保父类的所有基础属性(如
_animated、width、height)都已创建,再操作子类自定义属性,避免未初始化的错误。 - 使用
super()调用父类构造:比直接调用ptch.Circle.__init__更符合Python继承规范,多继承场景下更安全。 - 复用父类参数处理:父类已经处理了
radius、color等参数,无需自行重复赋值self.radius。
测试代码
# 创建画布和坐标轴 fig, ax = plt.subplots() # 实例化Particle rx_ry = np.array([0.3, 0.4]) radius = 0.1 velocity = np.array([0.01, 0.02]) particle = Particle(center=rx_ry, radius=radius, velocity=velocity, color='blue') # 将粒子添加到坐标轴 ax.add_patch(particle) # 设置坐标轴范围,确保粒子可见 ax.set_xlim(0, 1) ax.set_ylim(0, 1) plt.show()
内容的提问来源于stack exchange,提问作者SuperUser_Vermeylen
相关产品推荐
相关产品推荐

