Python - 定义仅使用一次的常量变量的最方便的方法

Gri*_*Mel 4 python convention coding-style pyqt pep

假设我有一个文件"icon.ico"和一个网址"url.com".
这将在课堂上使用一次 - "icon.ico"将设置为某个窗口,我们将在一个方法中执行url请求.
我有三种方法来定义这些变量.

第一种方式 - 定义为全局常量

#in the top of the file
ICON = "icon.ico"
URL = "http://url.com"

#and then
def setIcon(self):
    self.setWindowIcon(QtGui.QIcon(ICON))

def getData(self):
    content = requests.get(URL).content
Run Code Online (Sandbox Code Playgroud)

第二种方式 - 定义为类的变量

def __init__(self):
    self.url = "http://url.com"
    self.icon = "icon.ico"
Run Code Online (Sandbox Code Playgroud)

第三种方式 - 在方法中定义将被使用

def setIcon(self):
    icon = "icon.ico"

def getData(self):
    url = "http://url.com"
Run Code Online (Sandbox Code Playgroud)

小智 6

经验法则

  • 通常,您应该避免使用全局变量,因为它们会在程序完成之前导入模块,因此它们存在于内存中(第一种情况)
  • 通常,您应该避免在函数内部修复值(第2和第3种情况),因为它使函数可重用.

代替:

def __init__(self):
    self.url = "http://url.com"
    self.icon = "icon.ico"
Run Code Online (Sandbox Code Playgroud)

要么

def setIcon(self):
    icon = "icon.ico"
Run Code Online (Sandbox Code Playgroud)

是可取的:

def __init__(self, url, icon):
    self.url = url
    self.icon = icon
Run Code Online (Sandbox Code Playgroud)

或者,如果您认为这些值将是90%相同:

def __init__(self, url="http://url.com", icon="icon.ico"):
    self.url = url
    self.icon = icon
Run Code Online (Sandbox Code Playgroud)

何时使用每个案例的提示

第一种方式 - 定义为全局常量

  • 常量作为模块范围常量有意义.请记住,可以在同一模块中声明多个类和函数.这意味着常量将在整个模块中使用,并且它不拥有任何特定的类.
  • 你需要快速找到常数,通常是为了改变它的值.在这种情况下,你可能并不需要常量,而是变量.

第二种方式 - 定义为类的变量

  • 如果它是类的变量,则它不是常量.如果你想使用一个常量或变量的类的(例如在什么水平是一流的水平,而不是),你应该使用4个方法-作为一个一流水平不变.
  • 如果您想要实例级别常量或变量,则应使用2dn经验法则

第三种方式 - 在方法中定义将被使用

  • 你应该避免这种方式支持第二条经验法则

第4种方式 - 作为班级常数

  • 仅针对共享同一类的所有实例的变量和常量的推荐方式,实际上是什么意思是类级别类范围