首页 > 编程语言 >python实现常量类

python实现常量类

时间:2022-08-30 10:35:48浏览次数:56  
标签:__ const 常量 python self 实现 test def name

const 有什么好处? 最直接的好处是,防止被二次修改导致整个程序崩掉!

第一种方法, 使用enum来定义变量,防止串改.

from enum import Enum, unique
# 若要不能定义相同的成员值,可以通过 unique 装饰
@unique 
class Const(Enum):
    a = 0
    b = 5
    c = 10
Const.a.value
Const.b.value

第二种方法,自己实现一个常量类(利用单例实现)

# coding:utf-8
# Filename:test.py
import sys
class _const:
    # 实现单例
    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            orig = super(_const, cls)
            cls._instance = orig.__new__(cls, *args, **kw)
        return cls._instance
    
    class ConstError(TypeError):
        def __init__(self, name):
            self.msg = "Can't rebind or unbind const instance attribute {0}".format(name)
        
        def __str__(self):
            return 'error msg: {}'.format(self.msg)
        
        def __repr__(self):
            return self.__str__()
    
    class ConstCaseError(ConstError):
        def __init__(self, name):
            self.msg = "const name {0} is not all uppercase".format(name)
        
        def __str__(self):
            return 'error msg: {}'.format(self.msg)
        
        def __repr__(self):
            return self.__str__()
    
    def __setattr__(self, name, value):
        if name in self.__dict__:
            raise self.ConstError(name)
        if not name.isupper():
            raise self.ConstCaseError(name)
        self.__dict__[name] = value

    def __delattr__(self, name):
        if name in self.__dict__:
            raise self.ConstError(name)
        raise self.ConstError(name)

sys.modules[__name__] = _const() # 把Const类注册到sys.modules这个全局字典中(将系统加载的模块列表中的 test 替换为 _const() 实例)

在其他文件中定义常量:

import test
test.AA = 123 # 成功
test.bb = 111 # 报错,常量名需大写
test.AA = 111 # 报错,常量不能修改
del test.AA   # 报错,常量不能删除

标签:__,const,常量,python,self,实现,test,def,name
From: https://www.cnblogs.com/amgulen/p/16638416.html

相关文章

  • 巧用 transition 实现短视频 APP 点赞动画
    在各种短视频界面上,我们经常会看到类似这样的点赞动画:非常的有意思,有意思的交互会让用户更愿意进行互动。那么,这么有趣的点赞动画,有没有可能使用纯CSS实现呢?那当然是......
  • Python使用gdb进行debug的方法
    准备工作:1、必须安装gdb,一般系统默认安装过了,未安装的根据系统使用不同命令安装,比如yuminstallgdb,也可以用rpm命令进行安装2、必须有一个携带符号表的Python,版本与要......
  • python print居中-靠右-靠左输出
    1 居中输出   需要使用center函数使用center函数,需要str类型的数据。width参数:长度,需要填一个int类型的参数fillchar参数:两边填充的字符,需要一个str类型的参数(可以......
  • Python入门系列(五)一篇搞懂python语句
    If语句elif关键字是pythons表示“如果前面的条件不为真,那么试试这个条件”。Theelsekeywordcatchesanythingwhichisn'tcaughtbytheprecedingconditions.a=......
  • [CISCN2019 华北赛区 Day1 Web2]ikun-1|python反序列化
    考点:JWT身份伪造、pythonpickle反序列化、逻辑漏洞1、打开之后首页界面直接看到了提示信息,信息如下:2、那就随便注册一个账号进行登录,然后购买lv6,但是未发现lv6,那就查看......
  • python之面向对象
    面向对象本质:将特定的数据与特定的功能绑定到一起将来只能彼此相互使用对象其实就是一个容器里面将数据和功能绑定到一起使用场景一:​ eg:游戏人物......​ ......
  • vue PC端调用摄像头实现人脸识别
    一、思路vue打开摄像头获取视频流数据->截取视频流通过canvas绘制图片->图片传到服务器识别(后端使用的是阿里的人脸识别api)二、直接上代码<template><divclass="fac......
  • 小样本利器3. 半监督最小熵正则 MinEnt & PseudoLabel代码实现
    在前两章中我们已经聊过对抗学习FGM,一致性正则Temporal等方案,主要通过约束模型对细微的样本扰动给出一致性的预测,推动决策边界更加平滑。这一章我们主要针对低密度分离假设......
  • 从自己的项目出发去实现前端权限管理
    我在自己的后台管理项目中根据登录的用户不同,从而对不同的用户给予不同的权限。这里是通过路由,以及token验证,并且通过vuex进行全局的控制下面就从我自己的简单项目出发......
  • js 实现二叉树中序遍历
    varinorderTraversal=function(root){//迭代if(!root){return[];}letres=[];letstack=[];while(stack.length>......