【问题标题】:Python Class Instance Scope (& VS Code Autocomplete)Python 类实例范围(& VS Code 自动完成)
【发布时间】:2018-07-07 17:03:02
【问题描述】:

我正在将我的项目从被globals 乱扔垃圾迁移到实际具有由单独模块中定义的类定义的结构。这是我第一次真正使用 OOP,所以要确保我正确理解范围,因为我选择的 Python 编辑器(VS Code)没有正确执行自动完成/智能感知。

在我的代码顶部,我导入了我的模块 -

import NHLGameEvents

我在代码的 ma​​in 部分创建我的对象 -

if __name__ == '__main__':
    game_info = is_game_today()

    # Create a Game Object
    gameobj_game_type = game_info["gameType"]
    gameobj_date_time = game_info["gameDate"]
    gameobj_game_state = game_info["status"]["abstractGameState"]
    gameobj_venue = game_info["venue"]["name"]
    gameobj_live_feed = game_info["link"]

    gameobj_broadcasts = {}
    gameobj_broadcasts[broadcast_team] = broadcast_channel
    game = NHLGameEvents.Game(gameobj_game_type, gameobj_date_time, gameobj_game_state,
                              gameobj_venue, gameobj_live_feed, gameobj_broadcasts)

然后我有一个方法,我想记录该方法的一些属性 -

def get_game_events():
    logging.info("Getting data from endpoint: %s", game.live_feed)
    live_feed_json = requests.get(game.live_feed).json()
    return live_feed_json

我对上面的代码有两个问题 -

  1. 在我的get_game_events() 方法中,我应该能够访问game.live_feed 给定的范围吗?我的代码可以正确执行,但是一旦我输入 game. 语句,我就没有自动完成。
  2. 如果我应该在单独的方法(例如 main())中定义对象 - 如何确保我的代码中的其他方法可以访问这些类实例?

【问题讨论】:

  • get_game_events 在哪里定义?它怎么知道game
  • get_game_events 方法是在我正在编写的脚本的顶部定义的——我在其中导入了NHLGameEvents 模块并包含上述所有代码。我的理解是,如果 game = NHLGameEvents.Game(...) 不包含在方法中,那么它就是全局范围的一部分,可以在其他任何地方引用。这是我的问题的一部分。
  • 我不确定我是否理解第二个问题。你的意思是,如何访问 init 中声明的变量?
  • 是的,game 正如您所定义的,它在全局范围内。我有点困惑,因为我以为您说您是在尝试摆脱全局变量! :-) 无论如何,我不知道 VS 是如何自动完成的。
  • @BrenBarn 我的意思是 global 关键字比什么都重要,但是如果我的对象是在单独的方法中定义的,我如何确保其他方法可以访问它 - 做我必须将其作为参数传递?

标签: python oop autocomplete


【解决方案1】:

首先,我应该指出,函数是用def 声明的函数,而方法类似于函数,但它存在于类中。

1-是的,它应该能够访问游戏。在 python 中,你可以访问上层的变量,只要你不改变它的值。如果您在函数内设置变量的值,则只能在该函数内访问。

a = 1

def my_function():
    print(a) # Prints 1 when called
    a = 2
    print(a) # Prints 2 when called

print(a) # Prints 1

但是,我建议您始终将所需的值作为参数传递给函数。更简洁,并通过删除全局范围来避免副作用。

2-您不能从另一个函数访问函数的值,无论它被称为main 或其他名称。但是,只要第二个函数在第一个函数内,您就可以从另一个函数访问函数的值。例如:

def first_function():
    a = 1
    def second_function():
        print(a) # Prints 1

def my_function():
    prints(a) # Error, because 'a' does not exist in this scope.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多