Python - 不存在的引用变量

时间:2017-08-27 23:04:08

标签: python oop tkinter default-value instance-variables

我正在学习Python中的tkinter包,我对下一段代码并不了解:

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.hi_there = tk.Button(self)
        self.hi_there["text"] = "Hello World\n(click me)"
        self.hi_there["command"] = self.say_hi
        self.hi_there.pack(side="top")

        self.quit = tk.Button(self, text="QUIT", fg="red", command=root.destroy)
        self.quit.pack(side="bottom")

    def say_hi(self):
        print("hi there, everyone!")

root = tk.Tk()
app = Application(master=root)
app.mainloop()

据我所知self引用了类,当代码显示self.hi_there时,我希望该类中的全局变量必须先前声明。 hi_there是如何创建的?

还有什么用于拥有" master = None"在__init__方法?如果我从=None app = Application(master=root)跳过$ composer install --prefer-source 部分,那么它是否会相同?

2 个答案:

答案 0 :(得分:1)

self指的是实例。 self.hi_there是一个实例变量。通过执行app = Application(master=root),您可以创建Application的实例并将其保存到app。在您的情况下,selfapp

在创建属性之前,您不需要声明属性(尽管在__init__中创建属性是一种很好的做法)。

考虑例子:

class A()
    pass

a = A()
a.prop = 2
print(a.prop) #=> 2

关于master=None - 事实上,如果是您的代码,您只能使用master而且您知道自己会通过该代码。

答案 1 :(得分:1)

self引用类的实例,因此self.hi_there = foo将创建一个新的实例变量并将其分配给foo,如:

class Test:
    def __init__(self):
        self.foo = 'bar'

a = Test()
print(a.foo)

# output:
# bar

并且master=None将默认None值设置为master,除非您提供该值,例如:

app = Application() # here master will be None
app = Application(master=root) # here master will be root

这可以用于任何功能,这是另一个例子:

def plus(num=0):
    return num+num

print(plus(1))
print(plus())

# output:
# 2
# 0