簡體   English   中英

python中逐步操作對象的最佳類結構實踐

[英]Best class structure practice for step by step object manipulation in python

嗨,我想用多種方法創建一個類。 每種方法取決於另一種方法的結果。 一個簡化的示例如下所示:

class klass(object):
def __init__(self, x, y):
    self.x = x
    self.y = y
    self.results = 0

def method1(self):
    self.results = self.x + self.y
    return self.results

def method2(self):
    self.results = math.sqrt(self.results)
    return self.results

method2應該僅在method1之后調用。 即:

>>> b=klass(3.0, 4.0)
>>> b.method1()
7.0
>>> b.method2()
2.6457513110645907

這個想法是,某人可能只需要method1的結果,而其他人也可能需要method2的結果。 因此,第一人稱僅需要運行method1 ,第二人稱需要運行method1 ,然后運行method2

什么是最好的(最易讀和最簡單)的方法。

請注意,這是復雜類的簡單得多的版本

我會將結果切換為字典,然后分別保存每個級別的結果。 然后,您可以檢入每個方法中的if "level1" not in self.results: raise an exception但仍可以將每個級別的輸出提供給用戶。 此外,您可以通過檢查結果是否已經存在來啟動每種方法。 一個例子是這樣的:

class klass(object):
def __init__(self, x, y):
    self.x = x
    self.y = y
    self.results = {"level0": 0}

def method1(self):
    if "level1" not in self.results:
        self.results["level1"] = self.x + self.y
    return self.results["level1"]

def method2(self):
    if "level1" not in self.results:
        raise ValueError("The results of method1 are not yet available")
    if "level2" not in self.results:
        self.results["level2"] = math.sqrt(self.results["level1"])
    return self.results["level2"]

PS不要使用klass這個名字

如果我弄錯了,請更正我,但是您不能像這樣在method2中僅調用method1:

def method2(self):
    self.method1()
    self.results = math.sqrt(self.results)
    return self.results

您可以編寫單獨的函數以在單個位置聚合所需的函數:

class klass(object):

    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.results = 0

    def method1(self):
        self.results = self.x + self.y
        return self.results

    def method2(self):
        self.results = math.sqrt(self.results)
        return self.results

    def both_methods(self):
        self.method1()
        self.method2()
        return self.results

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM