<p>这里有两个基本问题。你知道吗</p>
<hr/>
<p>首先,您混合了<em>类属性</em>——也就是说,由同一类的所有实例共享的变量和普通的<em>实例属性</em>——也就是说,变量是每个实例的一部分。你知道吗</p>
<p>您很少需要任何类属性。但是,始终需要实例属性。因此,首先:</p>
<pre><code>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
</code></pre>
<p>注意<code>self.temperature</code>,而不仅仅是<code>temperature</code>。这就是创建实例属性的方法。这也是你如何访问或更新一个。你知道吗</p>
<hr/>
<p>其次,您还混合了<em>局部变量</em>——也就是说,在函数运行时存在的变量,然后随实例属性一起消失。但您已经知道如何从上面更新实例属性。所以:</p>
<pre><code>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 = '???'
</code></pre>
<p>(我不知道你想在<code>precis</code>里放什么,但很明显你不想把它作为“没有天气……”来放。)</p>
<hr/>
<p>如果你在没有第一次修复的情况下进行第二次修复,那么一切都将<em>看起来</em>正常,但只是巧合而已。当您请求<code>this.temperature</code>时,如果<code>this</code>没有名为<code>temperature</code>的实例属性,Python将自动查找类属性<code>type(this).temperature</code>。如果随后添加名为<code>temperature</code>的实例属性,它将“隐藏”class属性,因此下次执行<code>this.temperature</code>时,将获得实例的值。你知道吗</p>
<p>因此,您可以使用类属性作为实例属性的“默认值”。但你只有知道自己在做什么才应该这么做。(比如说,如果开始使用列表之类的可变值并在方法中对它们进行变异,这会让人非常困惑……)</p>