使用类'方法更新类'变量的实例是正确的吗?如果是,我该怎么办?

时间:2015-05-11 01:23:51

标签: python json oop object

我有以下代码;

class weather(object):
temperature = 0
humidity = 0
precis = "There is no weather when there plainly should be, please contact an administrator."
cloud = "none"
windDirection = "nnw"
windSpeed = 0

def getWeather(self):
    weatherJSON = requests.get('http://www.bom.gov.au/fwo/IDT60901/IDT60901.94970.json')
    weatherDoc = json.loads(weatherJSON.text)
    temperature = weatherDoc["observations"]["data"][1]["apparent_t"]
    humidity =  weatherDoc["observations"]["data"][1]["rel_hum"]
    windDirection = weatherDoc["observations"]["data"][1]["wind_dir"]
    windSpeed = weatherDoc["observations"]["data"][1]["wind_spd_kmh"]
    cloud = weatherDoc["observations"]["data"][1]["cloud_type"]

这是一个具有天气功能的类,并包含更新它们的功能。如果我然后使用

实例化该类
this = weather()
this.getWeather()

此变量不会随真实天气而更新。两个问题,为什么不,我想更多的是一个子问题,我这样做是对的吗?我的方法应该是使用类中的方法来操作类的实例吗?

2 个答案:

答案 0 :(得分:3)

这里有两个基本问题。

首先,你要混淆类属性 - 即由同一个类和普通实例属性的所有实例共享的变量 - 也就是说,变量是每个实例的一部分。

你很少想要任何类的属性。但是,您始终需要实例属性。所以,首先:

class weather(object):
    def __init__(self):
        self.temperature = 0
        self.humidity = 0
        self.precis = "There is no weather when there plainly should be, please contact an administrator."
        self.cloud = "none"
        self.windDirection = "nnw"
        self.windSpeed = 0

注意self.temperature,而不只是temperature。这就是你创建实例属性的方式。它也是您访问或更新一个的方式。

其次,你还混合了局部变量 - 即函数运行时存在的变量,然后消失 - 带有实例属性。但是你已经知道从上面更新实例属性了。所以:

def getWeather(self):
    weatherJSON = requests.get('http://www.bom.gov.au/fwo/IDT60901/IDT60901.94970.json')
    weatherDoc = json.loads(weatherJSON.text)
    self.temperature = weatherDoc["observations"]["data"][1]["apparent_t"]
    self.humidity =  weatherDoc["observations"]["data"][1]["rel_hum"]
    self.windDirection = weatherDoc["observations"]["data"][1]["wind_dir"]
    self.windSpeed = weatherDoc["observations"]["data"][1]["wind_spd_kmh"]
    self.cloud = weatherDoc["observations"]["data"][1]["cloud_type"]
    self.precis = '???'

(我不确定你想要放在precis中,但显然你不想把它留作“没有天气......”。)

如果您在没有第一个修补程序的情况下进行第二次修复,则所有内容都将显示,但只能巧合。当您要求this.temperature时,如果this没有名为temperature的实例属性,Python将自动查找类属性type(this).temperature。然后,如果您添加名为temperature的实例属性,它会“隐藏”类属性,因此下次执行this.temperature时,您将获得实例的值。

因此,可以使用类属性作为实例属性的一种“默认值”。但是如果你知道自己在做什么,那么你应该这样做。 (如果你开始使用像列表这样的可变值并在你的方法中改变它们,它会变得非常混乱......)

答案 1 :(得分:0)

  

两个问题,为什么不呢,我想更多的是一个子问题,我这样做了吗?

您正在更新getWeather()中的局部变量。

您应该更新实例变量,这可以通过在变量名前加上self来替换,换句话说,替换:

def getWeather(self):
    ...
    cloud = ...

def getWeather(self):
    ...
    self.cloud = ...