使用__getattribute __()改进了wx.Config封装

将变量分配给此类时,仍必须在“ default”之前加上前缀,但现在它允许val = inst.vaule:

"""Encapuslate a Default Values Object and Config File""" 
from inspect import getmembers
import wx 
class DefaultValueHolder(object):
    """Intended for use with wxConfig (or maybe _winreg) to set up and/or get
       registry key names and values. Name attrs as default*. "default"
       will be stripped of when reading and writing to the config file.
       You may not use the name varDict as one of the variable names.""" 
    def __init__(self, appName, grpName):
        """Open or create the application key"""
        self.appName = appName
        self.grpName = grpName  # if the key or group doesn't exit, it will be created
        self.config = wx.Config(appName)     # Open the file (HKCU in windows registry) 
    def __getattribute__(self, name):
        try:
            return object.__getattribute__(self, "default%s" %name)
        except AttributeError:
            return object.__getattribute__(self, name) 
    def GetVariables(self):
        return [{"name":var[0][7:], "value":var[1], "type":type(var[1])}
                for var in getmembers(self) if var[0].startswith('default')] 
    def SetVariables(self, varDict={}, **kwargs):
        kwargs.update(varDict)
        for name, value in kwargs.items():
            setattr(self, "default%s" %name, value) 
    def InitFromConfig(self):
        config = self.config
        group = self.grpName 
        if not config.Exists(group):
            self.WriteRegistryGroup(group) 
        else:
            config.SetPath(group)
            for var in self.GetVariables():
                name = var['name']
                if config.Exists(name):
                    value = self.ReadRegistry(name, var['type'])
                    self.SetVariables({name:value})
                else:
                    self.WriteRegistry(name, var['value'], var['type'])
        config.SetPath("") 
    def WriteRegistryGroup(self, group):
        self.config.SetPath(group)
        for var in self.GetVariables():
            self.WriteRegistry(var['name'], var['value'], var['type'])
        self.config.SetPath("") 
    def UpdateConfig(self):
        self.WriteRegistryGroup(self.grpName) 
    def ReadRegistry(self, name, type):
        value = None
        if type == str:
            value = self.config.Read(name)
        elif type in (int, long):
            value = self.config.ReadInt(name)
        elif type == float:
            value = self.config.ReadFloat(name)
        return value 
    def WriteRegistry(self, name, value, type):
        if type == str:
            self.config.Write(name, value)
        elif type in (int, long):
            self.config.WriteInt(name, value)
        elif type == float:
            self.config.WriteFloat(name, value)  
if __name__ == "__main__":
##    class SetSelfFromDefaults(object):
##        def __init__(self):
##            self.test = test = DefaultValueHolder("HETAP Pro 2.00", "Database")
##            test.SetVariables(UserName="peter", Password="pan", ServerName="MyServer", database="")
##            test.InitFromConfig()
##
##            self.SetupLoginVars(test)
##
##        def SetupLoginVars(self, defaultHolder):
##            """Cool tricks, use somewhere, someday."""
##            for var in defaultHolder.GetVariables():
##                execStr = "self.%s = %s" %(var['name'], (repr(var['value']), var['value'])[var['type'] != str])
##                exec(execStr) in locals()
##
##    testClass = SetSelfFromDefaults()
##    print testClass.UserName 
    test = DefaultValueHolder("HETAP Pro 2.00", "Database")
    test.SetVariables(UserName = "peter", Password = "pan", ServerName = "MyServer", database="")
    test.InitFromConfig()
    print test.UserName
    test.defaultvar1=77
    print test.GetVariables()
    #### this also works:
    ## test.defaultUserName = "joe"

From: https://bytes.com/topic/python/insights/593949-wx-config-encapsulation-improved-__getattribute__

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值