簡體   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