我有以下代码;
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()
此变量不会随真实天气而更新。两个问题,为什么不,我想更多的是一个子问题,我这样做是对的吗?我的方法应该是使用类中的方法来操作类的实例吗?
答案 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 = ...