从另一个 python 文件中获取变量。无属性错误

Posted

技术标签:

【中文标题】从另一个 python 文件中获取变量。无属性错误【英文标题】:Getting variables from another python file. No attribute error 【发布时间】:2018-07-16 00:08:29 【问题描述】:

我正在尝试为我的 Python 项目设置一个变量文件。 我有一个运行良好的函数:

def resize_window(self):
    size_object = QDesktopWidget().screenGeometry(-1)  # active screen
    screen_width = size_object.width()
    screen_height = size_object.height()

但是,当我尝试将其设置在单独的文件中以进行调用时,出现错误。

AttributeError: type object 'ScreenSize' 没有属性 'screen_width'

这是我的单独文件的外观:

class ScreenSize(object):
def __init__(self, screen_width, screen_height):
    self.screen_width = screen_width
    self.screen_height = screen_height
    self.resize_window()

def resize_window(self):
    size_object = QDesktopWidget().screenGeometry(-1)  # active screen
    screen_width = size_object.width()
    screen_height = size_object.height()

电话:

self.frame_top.setMinimumSize(QtCore.QSize(3/4* ScreenSize.screen_width, 1/10*ScreenSize.screen_height))
    self.frame_top.setMaximumSize(QtCore.QSize(3/4*ScreenSize.screen_width, 1/10*ScreenSize.screen_height))

错误是:AttributeError: type object 'ScreenSize' has no attribute 'screen_width'

如果我只用这个设置课程:

class ScreenSize(object):
screen_width = 500
screen_height = 300

它有效。所以我的问题是从类中调用该函数。 提前感谢您的帮助。

【问题讨论】:

缩进看起来不正确,令人困惑。 一个类与该类的实例不同。您在实例self 上设置属性,所以ScreenSize 类当然没有它们。那就是您做错了,但是问题中没有足够的信息来告诉您如何正确地做。您实际上不必为了分隔文件而将内容放入类中。 尝试使用self.screen_width。将self. 用于class 的所有变量。 【参考方案1】:

当你将你的类声明为

class ScreenSize(object):
    screen_width = 500
    screen_height = 300

变量属于类而不是类的实例。从这个意义上说,在这个类中包含函数等同于根本不将变量或函数包装在一个类中,因为 Python 中的脚本本质上只是一个类。

如果你想创建你的设置类的实例,你需要在你的类中声明的函数调用中使用self,然后创建该类的一个实例来检索值而不是类本身:

class ScreenSize(object):
    def __init__(self, screen_width, screen_height):
        self.screen_width = screen_width
        self.screen_height = screen_height
        self.resize_window()

    def resize_window(self):
        size_object = QDesktopWidget().screenGeometry(-1)  # active screen
        self.screen_width = size_object.width()
        self.screen_height = size_object.height()

screen_size = ScreenSize()

查看Python Classes 了解有关如何实现类的更多信息。

此外,正如 @gilch 在 cmets 中所指出的,如果您只想要它们的一个实例,则这些值不需要在一个类中:

# settings.py
screen_width = 500
screen_height = 300

def resize_window(self):
    size_object = QDesktopWidget().screenGeometry(-1)  # active screen
    screen_width = size_object.width()
    screen_height = size_object.height()

假设 settings.py 与 main 位于同一目录中:

#  main.py
import settings

print(settings.screen_width)
settings.resize_window()

【讨论】:

感谢您的建议。我真的很喜欢 settings.py 的方法。它完全实现了我所追求的。但是,当我运行它时,它返回 500 的 screen_width (初始设置),但我期望从 size_object 检索到的实际屏幕宽度在 1000 左右。我错过了什么? 嗨,如果您对这个答案感到满意,您能否将其标记为这样以结束此问题。谢谢!【参考方案2】:

根据建议,我通过创建单独的 .py 文件来实现它

def screen_width(self):
   size_object = PyQt5.QtWidgets.QDesktopWidget().screenGeometry(-1)  # active screen
   scr_width = size_object.width()
   return scr_width

感谢您为我指明正确的方向。

【讨论】:

以上是关于从另一个 python 文件中获取变量。无属性错误的主要内容,如果未能解决你的问题,请参考以下文章

从另一个php文件中获取变量

我想从另一个 python 文件中导入一个变量(Django)

如何从另一个 Qml 的 Qml 中的属性中获取值?

安装python出现错误说无安装权限

Python 3模块从另一个文件夹导入错误[重复]

如何修复“试图获取非对象的属性”Laravel 5