繁体   English   中英

如何使用上述类中的属性?

[英]How can I use attributes from the class above?

我创建了一个带有创建文件夹路径的函数的外部类,用户决定路径和内部类将绘图图像保存到该文件夹​​,用户决定文件名和格式。 我的问题是我不能使用外部类属性。 如何使用上述类中的属性? 这种依赖还有另一种干净的方式吗?

import os
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime
import pandas as pd

# Outter class
class Folders():
    def __init__(self,
        base_path="folder_name1/folder_name2"):
        self.base_path = base_path
        pass
# Function to create path of folders
    def create(self):
        try:
            os.makedirs(self.base_path)
        except FileExistsError:
            # directory already exists
            pass
# Inner class
    class Save:
        def __init__(self,current_date = datetime.today().strftime('%Y_%m_%d@%H_%M_%S'),
                     image_format = '.png',
                     image_name = '/name_of_image'):
            self.current_date = current_date
            self.image_name = image_name
# Function to save the images in the created path
        def image1(self):
            f.savefig(self.base_path+self.image_name+self.image_format, bbox_inches='tight')

# Plotting the figure
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-')

# Creates path of folders
folder = Folders()
folder.create()

# Save images with default arguments
save = folder.Save()
save.image1()

# Save images with chosen arguments
savea = folder.Save(image_format='.jpg', image_name='image_name')
savea.image1()

更仔细地查看代码并猜测“self.arguments”是指“ self属性”:您似乎认为内部类与外部类有某种关联,例如内部类的实例类隐式地有一些与它们一起创建的外部类的实例。 在 Python 中,情况并非如此。 self.base_path无法解析为某些Folders实例的base_path属性,因为self不是Folders实例 它是一个Save实例,并且Save不是Folders的子类。 它只是Folders定义,它只是命名空间(即,外部代码需要将类称为Folders.Save而不仅仅是Save )。

你应该完全重新设计它。 首先,这在设计方面没有任何意义:说您有“文件夹”或“保存”是什么意思? 什么那些东西? 请记住,“对象”是事物的奇特词,而“类”是“事物的种类”的奇特词。

无论如何,向类的实例提供信息的自然方法是将其传递给构造函数,然后让__init__将该信息存储在某处。 您知道,就像您最初创建Folders实例时已经在做的那样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM