码迷,mamicode.com
首页 > 其他好文 > 详细

PyQt挖地雷游戏学习笔记(3)

时间:2014-09-12 06:45:53      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:io   使用   文件   数据   sp   on   c   ad   ef   

这个程序使用了Python有特色的语法套路。先看第一个。

main.py里的class MainWindow的函数init()中,有这样的语句:

self.scene.setMap((conf.w, conf.h), conf.mines)

这里的变量conf,定义在config.py中,由以下语句引入的:

from config import *

这里的conf.w和conf.h是什么呢?由此,转入config.py,一探究竟。

#module: config

import json
    
DEFAULTS = {
    'splash':False,
    'w': 10,
    'h': 10,
    'mines': 1,
    'scores': [],
    }

DEFAULT_SAVE_FILE = "config.cfg"

class _Conf:
    def __getattr__(self,name):
        return DEFAULTS[name]

    def __setattr__(self,name,value):
        if type(value) != type(DEFAULTS[name]):
            raise Exception("%s %s is not %s:" % 
                            (value, type(value), type(DEFAULTS[name])))
        DEFAULTS[name] = value

    def save(self,fileName=DEFAULT_SAVE_FILE):
        with open(fileName, 'w+') as fp:
            json.dump(DEFAULTS, fp, indent=True)
            
    def load(self,fileName=DEFAULT_SAVE_FILE):
        with open(fileName, 'r') as fp:
            global DEFAULTS
            DEFAULTS = json.load(fp)

conf = _Conf()
try:
    conf.load()
except:
    pass

由此可见,main.py导入该模块,会发生以下事情:

建立并初始化模块级变量,词典DEFAULTS;

建立并初始化模块级变量,DEFAULT_SAVE_FILE = "config.cfg"

建立模块级变量conf,并以此实例化 _Conf;

以conf引用 _Conf中的函数load(),把config.cfg文件中的数据,读入DEFAULTS。

遍观 _Conf,并没有成员变量w和h,但为何使用conf.w和conf.h呢?

奥妙在于 _Conf中的特别函数 __getattr__(name)

当以conf.w读数据时,__getattr__ 的参数name的值,就是“w”,

而它返回的值,是DEFAULTS[“w”]。这个值等于10。

Python的这一语法套路,读取词典DEFAULTS的操作,表现形式成了访问class的成员。

PyQt挖地雷游戏学习笔记(3)

标签:io   使用   文件   数据   sp   on   c   ad   ef   

原文地址:http://blog.csdn.net/lawme/article/details/39217243

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!