簡體   English   中英

從類python返回一個值

[英]return a value from class python


編輯

所以我早些時候問了這個問題,並且得到了很好的見識,但是我覺得我的問題沒有得到真正的回答。 我正在構建一個小程序以使用python進行練習並制作GUI,而按鈕命令存在一個小問題。

#This is the temperature menu:
def temperM(self, *args):
    self.clearscreen(self.frame)
    self.frame2 = Frame(self.root)
    self.frame2.grid(column = 0, row = 0)


    self.firstunit = StringVar()
    self.secondunit = StringVar()

    self.entryspace = IntVar()
    self.displayspace = IntVar()

    #Create back button

    #This is the part that needs to be fixed

    self.back = Button(self.frame2, text = "< Back",
     command = lambda: self.redo(self.frame2))
    self.back.grid(column = 1, row = 3)

    self.label = Label(self.frame2, text = "Convert from: ")
    self.label.grid(column = 1, row = 1, padx = 4)

    #Create the check boxes

    self.celsius = Checkbutton(self.frame2, text = "Celsius",
     variable = self.firstunit, onvalue = 'celsius')
    self.celsius.grid(column = 2, row = 1)

    self.fahrenheit = Checkbutton(self.frame2, text = "Fahrenheit",
     variable = self.secondunit, onvalue = 'fahrenheit')
    self.fahrenheit.grid(column = 3, row = 2)

    #Create entry space to recieve text


    #This is where the problem starts.
    self.entry = Entry(self.frame2, width = 7,
     textvariable = self.entryspace)
    self.entry.grid(column = 3, row = 3)

    self.compute = Calculate(self.entryspace.get())

    self.button = Button(self.frame2, text = "Calculate",
     command = lambda: self.displayspace.set(self.compute.celtoFah()))
    self.button.grid(column = 3, row = 4)

    self.display = Label(self.frame2, textvariable = self.displayspace)
    self.display.grid(column = 2, row = 2)

我在帶有def__init__(self, root)class Menu內擁有此功能, class Menu創建所有不同的菜單選項。

class Calculate:

    def __init__(self, number):
        self.number = number

    def celtoFah(self):
        try:
            self.temp = Temperature()
            self.number = float(self.number)
            return self.temp.C2F(self.number)
        except ValueError:
            pass

我有一個此類,其中包含將在代碼中使用的所有不同的計算。

我遇到的麻煩是使用按鈕命令command = lambda: self.displayspace.set(self.compute.celtoFah()) 當我運行代碼並按運行命令self.displayspace.set() 'Calculate'時,它沒有將self.displayspace設置為我認為返回值應該是的值。 相反,它返回並將self.displayspace設置為self.entryspace.get()最初未經修改的值(分別為32和0),這使我相信self.compute = Calulate(self.entryspace.get())當我輸入新值時不會更新,因此self.entryspace不會獲得新值,但保留與IntVar()建立的相同初始值。 我在自己的代碼中為self.entryspace進行了錯誤操作,以不使用新值進行更新嗎? 起初,我將其作為StringVar()轉換為celtoFah的浮點數,但我拋出ValueError的原因是,即使用戶輸入了值,它仍接收到空字符串。 我真的想將所有計算都保存在一個單獨的類中,因為最終版本中將有20個以上的版本,但是我應該將這些命令移到class Menu類中嗎?還是可以通過一個單獨的類來完成這些操作? 如果您需要查看我的完整代碼,請在github上找到它的鏈接: https : //github.com/Flameancer/Unit-Conversion-Program-in-Python

通常,您不在之間傳遞值,而是在這些類的實例之間傳遞值。 在任何給定時間,您可能有0、1或30個不同的Foo實例。 Bar實例如何知道您想要哪個實例?

第一個問題是,誰打電話來的是something關於這種方法Bar 無論是誰,他都有價值。 也許應該是Foo實例正在執行調用。

為此, foo實例必須知道bar實例。 也許您想在構造函數中創建一個:

class Foo:
    def __init__(self, argument):
        # ...
        self.bar = Bar(42)
        # ...

…現在您可以像使用其他成員一樣使用它:

    def function(self, *args):
        # ...
        randomness = self.bar.something()
        self.displayfield.set(randomness)
        # ...

或者也許您已經在某個地方構造了一個,而只想將其作為構造函數傳遞給Foo實例:

class Foo:
    def __init__(self, argument, bar):
        # ...
        self.bar = bar
        # ...

bar = Bar(42)
foo = Foo(23, bar)

或者,也許您想在每次調用function方法時在本地構造一個新的。 或者,無論您有多少個Foo實例,您都希望每個人共享一個全局Bar實例。 要么…

如您所見, Foo實例和Bar實例之間存在許多不同的可能關系,哪種合適完全取決於FooBar實際代表什么。 這是對象建模背后的代碼思想:對象代表某種事物,這些事物之間的關系反映在這些對象之間的關系中。

暫無
暫無

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

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