创建对象时避免使用全局变量

时间:2015-03-21 14:48:26

标签: python object

创建对象时如何避免全局变量?有人告诉我,当我创建对象时,它被认为是全局的。

例如,如果我有这样的课程

 class Windpower(object):
def __init__(self,name):
    self.name=name

def calc_area(self,dia):
    area=((dia/2)**2*math.pi) 
    return area

def calc_wind_energy(self,area,v):
    energy=(random.uniform(0.10,0.4)*1.2*area*v**3*0.5) 
    return energy

def get_velocity(self): 
    with open('smhi.txt') as input:
        smhi_list=[int(line.strip()) for line in input if line.strip()] 
        return smhi_list

windpower = Windpower("Stockholm") 
solarpower=Solarpower(500,4)

Main.py

def average(lat):
    energy_list = [] #
    table = [] # 
    area = klass.solarpower.area
    sundigit=klass.solarpower.sundigit

2 个答案:

答案 0 :(得分:0)

这更像是python中的反模式而不是其他任何东西。应该避免在模块级别上拥有可执行代码的行为,因为这可以在其他模块导入模块时执行。

然而,有些情况需要在模块级别放置代码,例如在模块上提供对象作为API的一部分(想想Singleton),或进行任何模块初始化。

如果只在将模块作为主程序运行时才需要执行此代码,则应将其置于

之下
if __name__ == '__main__':
    windpower = Windpower("Stockholm") 
    solarpower=Solarpower(500,4)

或者将它们放在一个功能中。

请记住术语"全球"这里不正确,因为这些对象的范围是他们定义的模块,而不是整个可执行程序。

答案 1 :(得分:0)

当您在模块的顶层(python文件)中实例化对象时,就像您在示例代码中所做的那样,可以从模块的根目录访问它们。

但是,您确实应该在使用它们的模块中实例化它们。这是一个例子:

wind.py

class WindPower(object):
  def __init__(self,name):
    self.name=name

main.py

import wind
city = wind.WindPower("Stockholm")

velocity = city.get_velocity()