Python内部类如何访问外部类属性?这类依赖有没有更简洁的实现方式?
解决方案
内部类访问外部类属性的修改方法
Python 中的嵌套类不会自动持有外部类的实例引用,需要手动传递外部实例给内部类使用,修改逻辑如下:
- 给内部类
Save的__init__方法新增参数接收外部类Folders的实例,存储为内部属性 - 同步修复默认参数、路径拼接、全局变量引用的已知问题
修改后的可运行代码如下:
import os import matplotlib.pyplot as plt import numpy as np from datetime import datetime import pandas as pd class Folders(): def __init__(self, base_path="folder_name1/folder_name2"): self.base_path = base_path # 创建文件夹路径 def create(self): try: os.makedirs(self.base_path) except FileExistsError: pass # 返回绑定当前外部实例的Save对象 def get_saver(self, current_date=None, image_format='.png', image_name='/name_of_image'): return self.Save( outer=self, current_date=current_date, image_format=image_format, image_name=image_name ) # 内部类 class Save: def __init__(self, outer, current_date=None, image_format='.png', image_name='/name_of_image'): # 存储外部类实例引用 self.outer = outer # 避免默认参数只计算一次的坑,在初始化时生成时间 self.current_date = current_date if current_date else datetime.today().strftime('%Y_%m_%d@%H_%M_%S') self.image_format = image_format self.image_name = image_name # 保存图片,接收绘图对象作为参数 def image1(self, fig): save_path = os.path.join(self.outer.base_path, f"{self.image_name}{self.image_format}") fig.savefig(save_path, bbox_inches='tight') # 绘图逻辑 x = np.linspace(0, 6*np.pi, 100) y = np.sin(x) f = plt.figure() ax = f.add_subplot(111) ax.plot(x, y, 'r-') # 创建文件夹 folder = Folders() folder.create() # 用默认参数保存 save = folder.get_saver() save.image1(f) # 自定义参数保存 savea = folder.get_saver(image_format='.jpg', image_name='image_name') savea.image1(f)
更清晰的依赖实现方案
嵌套类在这个场景下没有实际价值,反而拉高了耦合度,推荐两种更易维护的写法:
- 拆分独立类:把保存功能拆成独立的工具类,初始化时直接传入已经创建好的根路径即可,不需要和文件夹类做嵌套绑定
- 合并功能到同一类:保存图片本身就是基于文件夹路径的衍生操作,直接把保存方法写到
Folders类中即可,不需要额外拆分内部类
优化建议
- 路径拼接不要直接用字符串相加,用
os.path.join()或者pathlib处理,避免不同操作系统的路径分隔符兼容问题 - 不要在类方法中直接引用全局的绘图变量,把绘图对象作为参数传入保存方法,提高代码复用性
- 不要把动态计算的
datetime.today()作为默认参数,Python的函数默认参数是在定义阶段计算的,多次调用会拿到同一个固定时间值
内容的提问来源于stack exchange,提问作者Gerard
相关产品推荐
相关产品推荐

