【问题标题】:Python 3 Scope between classes in separate files?单独文件中的类之间的Python 3范围?
【发布时间】:2019-11-18 22:09:01
【问题描述】:

我已经研究了很长时间,但找不到这个特定的问题(所以也许我遗漏了一些简单的东西!)但我在将类分成不同的 .py 文件时遇到了麻烦。

场景:

Main 类导入一个 Settings 类文件和一个 Work 类文件。Settings 类使用从 Object 类文件实例化的对象填充一个列表...

Work 类想要循环遍历该列表并更改每个对象中的值。

我已经通过将值设为类变量而不是实例来进行尝试。我仍然必须在工作类中导入设置类,以便编写代码来访问要更改的值。但它不会更改调用所有这些类的主类中该类的实例!

我读了一篇关于属性的文章。他们给出的示例仍然是同一文件中不同类的示例。

任何关于我应该看什么的建议将不胜感激!

这是我正在做的测试:

所有运行的主文件:

import Set_Test
import Test_Code

sting = Set_Test.Settings()
tc = Test_Code.Testy()

ID = sting._settingsID
print(f'Settings ID is: {ID}')

tc.changeVal()

ID = sting._settingsID
print(f'Settings ID is: {ID}')

Set_Test.py:

class Settings:

    def __init__(self):
        self._settingsID = 1

    @property
    def settingsID(self):
        return self._settingsID

    @settingsID.setter
    def settingsID(self, value):
        self.settingsID = value

Test_Code.py:

import Set_Test

class Testy:

    def changeVal(self):
        Set_Test.Settings.settingsID = 8

【问题讨论】:

  • 对,但究竟是什么问题?你看到了什么行为,你期望什么?
  • 我希望Test_Code中的changeVal方法改变Set_Test中settingsID的值。所以在第二次打印时它应该打印新值。
  • @Ripfury 这应该是self._settingsID = value,注意下划线
  • 因为它只是打印 1 而不是 8
  • @Ripfury 而这个Set_Test.Settings.settingsID = 8 导致class variable 没有像预期的那样改变实例变量的值。

标签: python python-3.x class variables scope


【解决方案1】:

感谢在 cmets 中提供答案的 stovfl。我最终设法破译了 stovfl 的含义:D

我想!

下面的代码适用于任何想知道的人:

主要:

import Set_Test
import Test_Code

sting = Set_Test.Settings()
tc = Test_Code.Testy()

ID = sting._settingsID
print(f'Settings ID is: {ID}')

tc.changeVal(sting)

ID = sting._settingsID
print(f'Settings ID is: {ID}')

Set_Test.py:

class Settings:

    def __init__(self):
        self._settingsID = 1

    @property
    def settingsID(self):
        return self._settingsID

    @settingsID.setter
    def settingsID(self, value):
        self._settingsID = value

Test_Code.py

import Set_Test
sting = Set_Test.Settings()

class Testy():

    def changeVal(self, sting):
        print(sting.settingsID)
        sting.settingsID = 8
        print(sting.settingsID)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-12
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2021-01-29
    • 2020-09-25
    相关资源
    最近更新 更多