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

埃洛米斯(Elomis)

我有以下代码;

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()

此变量不会随实际天气更新。有两个问题,为什么不呢?我想这只是一个子问题,我是对的吗?我的方法应该是使用类中的方法来操纵该类的实例吗?

阿巴内特

您这里有两个基本问题。


首先,您要混合使用类属性(即,由同一类的所有实例共享的变量)和普通实例属性(即,作为每个实例的一部分的变量)。

您很少需要任何东西的类属性。但是,您一直都需要实例属性。因此,从以下内容开始:

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会自动寻找class属性type(this).temperature如果然后添加一个名为的实例属性temperature,它将“遮盖”该类属性,因此下次执行操作时this.temperature,您将获得实例的值。

因此,您可以将类属性用作实例属性的一种“默认值”。但是,只有知道自己在做什么,才应该这样做。(例如,如果您开始使用可变值(例如列表)并在方法中对其进行变异,那将使您非常困惑。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用太多的静态变量而不是普通变量是否更昂贵?如果是,那怎么办?

来自分类Dev

magento中的哈希密码功能是否已更改?如果是这样,该怎么办?

来自分类Dev

是否可以更新系统映像备份?如果是这样怎么办?

来自分类Dev

我可以使用C ++中的函数来初始化类成员变量吗?如果可以,该怎么办?

来自分类Dev

是否可以在循环中的每种方法之后检查条件?如果是这样,怎么办?

来自分类Dev

我可以在bash的文件路径中使用变量吗?如果是这样,怎么办?

来自分类Dev

创建构造函数的实例后更改其属性是否会影响实例?如果是,那怎么办?

来自分类Dev

是否可以依次逐个启动各种物联网边缘模块?如果是这样,该怎么办?

来自分类Dev

VS 2013中“ Zither字符串”的颜色是否表示某些东西?如果是这样,该怎么办?

来自分类Dev

调用glBindVertexArray(vao):如果已经绑定了“ vao”,该怎么办?如何设计形状类?

来自分类Dev

调用glBindVertexArray(vao):如果已经绑定了“ vao”,该怎么办?如何设计形状类?

来自分类Dev

如果我们将类的实例存储在树集中会怎么办?

来自分类Dev

我是否需要在第二个if语句中指定不使用第二个变量?如果是这样,怎么办?

来自分类Dev

如果要使用没有更新编译器的新功能该怎么办?

来自分类Dev

如果isAvailableForServiceType方法返回NO,该怎么办

来自分类Dev

如果函数应用程序是类型类怎么办?

来自分类Dev

如果静态类Load失败怎么办

来自分类Dev

我需要同步吗?如果是这样,该怎么办?

来自分类Dev

我的笔记本电脑风扇会死吗?如果是,该怎么办?

来自分类Dev

是否可以在不使用Heroku Toolbelt的情况下部署Rails应用程序?如果是这样,怎么办?

来自分类Dev

是否可以制作可重复使用的代码以添加背景图像?如果是这样,怎么办?

来自分类Dev

Linux内核是否重复使用具有重复安装点的dentry结构?如果是这样,怎么办?

来自分类Dev

是否可以在不使用Heroku Toolbelt的情况下部署Rails应用程序?如果是这样,怎么办?

来自分类Dev

如果要使用zabbix监视VoltDB,该怎么办?

来自分类Dev

从外部删除实例该怎么办?

来自分类Dev

我们可以在Java中使用null对象调用静态方法吗?如果是这样,怎么办?

来自分类Dev

是否使用数据集。该怎么办?

来自分类Dev

是否使用数据集。该怎么办?

来自分类Dev

如果AsyncTask被取消,该怎么办?

Related 相关文章

  1. 1

    使用太多的静态变量而不是普通变量是否更昂贵?如果是,那怎么办?

  2. 2

    magento中的哈希密码功能是否已更改?如果是这样,该怎么办?

  3. 3

    是否可以更新系统映像备份?如果是这样怎么办?

  4. 4

    我可以使用C ++中的函数来初始化类成员变量吗?如果可以,该怎么办?

  5. 5

    是否可以在循环中的每种方法之后检查条件?如果是这样,怎么办?

  6. 6

    我可以在bash的文件路径中使用变量吗?如果是这样,怎么办?

  7. 7

    创建构造函数的实例后更改其属性是否会影响实例?如果是,那怎么办?

  8. 8

    是否可以依次逐个启动各种物联网边缘模块?如果是这样,该怎么办?

  9. 9

    VS 2013中“ Zither字符串”的颜色是否表示某些东西?如果是这样,该怎么办?

  10. 10

    调用glBindVertexArray(vao):如果已经绑定了“ vao”,该怎么办?如何设计形状类?

  11. 11

    调用glBindVertexArray(vao):如果已经绑定了“ vao”,该怎么办?如何设计形状类?

  12. 12

    如果我们将类的实例存储在树集中会怎么办?

  13. 13

    我是否需要在第二个if语句中指定不使用第二个变量?如果是这样,怎么办?

  14. 14

    如果要使用没有更新编译器的新功能该怎么办?

  15. 15

    如果isAvailableForServiceType方法返回NO,该怎么办

  16. 16

    如果函数应用程序是类型类怎么办?

  17. 17

    如果静态类Load失败怎么办

  18. 18

    我需要同步吗?如果是这样,该怎么办?

  19. 19

    我的笔记本电脑风扇会死吗?如果是,该怎么办?

  20. 20

    是否可以在不使用Heroku Toolbelt的情况下部署Rails应用程序?如果是这样,怎么办?

  21. 21

    是否可以制作可重复使用的代码以添加背景图像?如果是这样,怎么办?

  22. 22

    Linux内核是否重复使用具有重复安装点的dentry结构?如果是这样,怎么办?

  23. 23

    是否可以在不使用Heroku Toolbelt的情况下部署Rails应用程序?如果是这样,怎么办?

  24. 24

    如果要使用zabbix监视VoltDB,该怎么办?

  25. 25

    从外部删除实例该怎么办?

  26. 26

    我们可以在Java中使用null对象调用静态方法吗?如果是这样,怎么办?

  27. 27

    是否使用数据集。该怎么办?

  28. 28

    是否使用数据集。该怎么办?

  29. 29

    如果AsyncTask被取消,该怎么办?

热门标签

归档