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

这个程序使用了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和conf.mines是什么呢?由此,转入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和mines,但为何使用conf.w,conf.h和conf.mines呢?

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

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值