首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在类中设置变量并使用python中的方法更新它,以便在类中重用。

在类中设置变量并使用python中的方法更新它,以便在类中重用。
EN

Stack Overflow用户
提问于 2019-02-06 01:30:51
回答 2查看 61关注 0票数 0

我试图在一个类中设置一个变量,然后用一个类方法更新它,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class App:
    x = 2
    y = 2

    def __init__(self, master, x, y):
        for i in range(x):
            for j in range(y):
                b = Entry(master)
                b.grid(row=i, column=j)
        Button(text='Add ', command=self.enlarge).grid(row=height,
               column=width)
        Button(text='Remove', command=self.shrink).grid(row=height,
               column=width - 1, sticky="e")

    @classmethod
    def enlarge(cls):
        cls.x += 1

    @classmethod
    def shrink(cls):
        cls.x -= 1 

root = Tk()
app = App(root)
mainloop()

即使方法更新x,它也不会更新init函数中的全局x。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-06 01:55:07

我试着修改了你的代码。首先,当您的类“App”中的x被更改时,当窗口没有重新加载时,不会自动追加一个额外的行。当x发生变化时,我假设您有另一个函数来重新加载窗口。如果没有,您可以再次调用init()。

现在,更改代码(python3):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from tkinter import Entry, Button
import tkinter as tk

class App:
    x = 2
    y = 2

    def __init__(self, master):
        self.master = master
        self.topFrame = tk.Frame(master)
        self.topFrame.grid(row = 0, columnspan = 2)
        for i in range(self.x):
            for j in range(self.y):
                b = Entry(self.topFrame)
                b.grid(row=i, column=j)
        Button(self.topFrame, text='Add ', command=self.enlarge).grid(row=2,
               column=2)
        Button(self.topFrame, text='Remove', command=self.shrink).grid(row=2,
               column=2 - 1, sticky="e")

    def enlarge(self):
        self.x += 1
        self.topFrame.destroy()
        self.__init__(self.master)

    def shrink(self):
        self.x -= 1
        self.topFrame.destroy()
        self.__init__(self.master)

root = tk.Tk()
app = App(root)
tk.mainloop()

注意,调用init()方法来重新加载窗口。基本上,x和y参数从init()方法中删除,成为类'App‘的属性。

票数 0
EN

Stack Overflow用户

发布于 2019-02-06 01:52:02

您已经将xy创建为类变量。传递给您的x函数和y函数只是函数参数,它们既不属于类,也不属于实例。

现在,如果您想访问init中的x和y类变量,可以使用selfself.__class__访问它。但是,请注意,如果实例变量与类变量同名,并且尝试使用self访问它们,则将首先选择实例变量,只有在没有找到同名实例变量时,才会考虑类变量。

我用您发布的代码创建了一个简单的示例,演示如何访问init函数中的类变量。请检查如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class App:
    x = 2
    y = 2

    def __init__(self):
        for i in range(self.__class__.x):
            for j in range(self.__class__.y):
                print ("%s %s" %(i,j))

    @classmethod
    def enlarge(cls):
        cls.x += 1

    @classmethod
    def shrink(cls):
        cls.x -= 1

app = App()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54550314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文