【问题标题】:Print function prints twice a field from a class打印函数从一个类中打印两次字段
【发布时间】:2018-12-28 15:09:50
【问题描述】:

我正在使用print 函数从另一个 python 模块的类中打印一个字段,它会打印该字段两次。

我有两个模块:

ma​​in.py:

from statics import RiskyCars

class Car:
    def __init__(self, name):
        self.name = name

# init
RiskyCars()
print(RiskyCars.risky_cars[0].name)

statics.py:

class RiskyCars:

    @staticmethod
    def __init__():
        from main import Car
        RiskyCars.risky_cars = []
        RiskyCars.risky_cars.append(Car("car1"))

当我运行main.py 时,它会打印两次:

C:\Python27\python.exe C:/Users/myuser/PycharmProjects/Project1/main.py
car1
car1

但如果我在print 函数之前放置断点:

# main.py
# init
RiskyCars()     <--- break point

然后从终端手动运行:

print(RiskyCars.risky_cars[0].name)

它只打印一次。

为什么会这样?

【问题讨论】:

  • 有几件事让我觉得很奇怪:__init__() 被标记为静态,而你 import 来自 main。基本上:这两件事都不做。

标签: python python-2.7 pycharm


【解决方案1】:

Python 将您为您运行的主脚本 main 重命名为 __main__。发生的情况是您运行main(称为__main__),它运行RiskyCars.__init__,然后导入main(称为main)。因此脚本main 运行了两次。

解决方法是将main.py改写为

from statics import RiskyCars

if __name__ == '__main__':  # only execute if run as main script
    # init
    risky_car_1 = RiskyCars()  # lets at least pretend this is sensible
    print(RiskyCars.risky_cars[0].name)

statics.py

from cars import Car

class RiskyCars:
    risky_cars = []
    def __init__(self):
        RiskyCars.risky_cars.append(Car("car1"))

并创建一个名为cars.py的新文件

class Car:
    def __init__(self, name):
        self.name = name

【讨论】:

  • 谢谢。我不能将导入移到函数 __init__ 之外,因为它会导致双向导入:statics.pymain.py 导入,从 statics.py 导入等等......然后我将无法在main.py 中使用RiskyCars()。避免这种情况的最好方法,就像你和@Aran-Fey 提到的那样,将代码分开 - 将 Car 放在不同的文件中。
  • 如果您将导入放在正常位置,我很高兴解释器禁止这样做。不过这应该是一个警告;)
猜你喜欢
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 2012-09-06
  • 2017-06-25
相关资源
最近更新 更多