鱼C论坛

 找回密码
 立即注册
查看: 673|回复: 11

[已解决]python中导入模块

[复制链接]
发表于 2018-9-21 15:45:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
const.py代码如下:
class Const:
        
    def __setattr__(self, NAME, value):
        if NAME  in self.__dict__:
            raise TypeError('常量无法改变')
        if not NAME.isupper():
            raise TypeError('常量名必须大写')
        self.__dict__[NAME]=value

import sys

sys.modules[__name__]=Const()

在新py文件中运行如下代码:
import const

const.NAME = 'FishC'
print(const.NAME)

老是出错,不知道啥原因
最佳答案
2018-9-21 16:02:35
我刚才可能说错了,我建了2个PY文件没问题,你带吗贴对了嘛
1537515924(1).jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-21 15:48:15 | 显示全部楼层
赋值程序无限调用setattr
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 15:49:15 | 显示全部楼层
class Const:
        
    def __setattr__(self, NAME, value):
        if NAME  in self.__dict__:
            raise TypeError('常量无法改变')
        if not NAME.isupper():
            raise TypeError('常量名必须大写')
        super.__dict__[NAME]=value
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 15:56:20 | 显示全部楼层
RIXO 发表于 2018-9-21 15:49
class Const:
        
    def __setattr__(self, NAME, value):

显示super没有这个属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 15:59:22 | 显示全部楼层
塔利班 发表于 2018-9-21 15:48
赋值程序无限调用setattr

怎么解决呀,super.__dict__[NAME]=value 也不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 16:02:35 | 显示全部楼层    本楼为最佳答案   
我刚才可能说错了,我建了2个PY文件没问题,你带吗贴对了嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 16:08:35 | 显示全部楼层
塔利班 发表于 2018-9-21 16:02
我刚才可能说错了,我建了2个PY文件没问题,你带吗贴对了嘛

好奇怪,IDLE中没错,spyder中显示:
Traceback (most recent call last):

  File "<ipython-input-9-5fc546b8f7a5>", line 1, in <module>
    runfile('D:/python练习/新建文件夹/new project/1.py', wdir='D:/python练习/新建文件夹/new project')

  File "E:\anaconda\anaconda\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "E:\anaconda\anaconda\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "D:/python练习/新建文件夹/new project/1.py", line 10, in <module>
    const.NAME = 'FishC'

  File "D:\python练习\新建文件夹\new project\const.py", line 16, in __setattr__

TypeError: 'mappingproxy' object does not support item assignment
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 16:11:01 | 显示全部楼层
我也不知道,不同IDE机制不一样吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 16:14:46 | 显示全部楼层
....看错了,你上面的代码是没有问题的,问题出在引用的部分,直接创建的是文件名(模块)的属性,不是类的属性,你没有创建一个实例对象,其实类属性也不会报无限迭代的错,顶多就是想错了,但估计你在第一个文件下面写的那段sys.modules[__name__]=Const() 导致一直在引用模块出现了错误
你可以直接引用
class Const:
        
    def __setattr__(self, NAME, value):
        if NAME  in self.__dict__:
            raise TypeError('常量无法改变')
        if not NAME.isupper():
            raise TypeError('常量名必须大写')
        self.__dict__[NAME]=value

const = Const()
const.NAME = 'FishC'
print(const.NAME)

或者把第一个保存为模块
class Const:
        
    def __setattr__(self, NAME, value):
        if NAME  in self.__dict__:
            raise TypeError('常量无法改变')
        if not NAME.isupper():
            raise TypeError('常量名必须大写')
        self.__dict__[NAME]=value

第二个文件
from const import Const

const = Const()
const.NAME = 'FishC'
print(const.NAME)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 16:29:54 | 显示全部楼层
RIXO 发表于 2018-9-21 16:14
....看错了,你上面的代码是没有问题的,问题出在引用的部分,直接创建的是文件名(模块)的属性,不是类的 ...

好像就是spyder BUG了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 16:31:01 | 显示全部楼层
塔利班 发表于 2018-9-21 16:11
我也不知道,不同IDE机制不一样吧

好像就是BUG了,重启了就能行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 16:31:01 | 显示全部楼层
泷谷源治 发表于 2018-9-21 16:29
好像就是spyder BUG了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 02:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表