Python 定义自己的常量类

1,456次阅读
没有评论

在实际的程序开发中,我们通常会将一个不可变的变量声明为一个常量。在很多高级语言中都会提供常量的关键字来定义常量,如 C++++ 中的 const , Java 中的 final 等,但是 Python 语言因为变量无类型,所以也就不存在这样的修饰符,其本身并未提供任何机制来进行常量的定义。因此我们只能通过自己定义类的方法来定义一个符合常量规则的类,使得该类定义的成员属性满足常量的属性。常量一般符合以下两条规则:

  1. 常量的各个字母使用大写字母表示,中间以下划线连接:如 MAX_VALUE;
  2. 常量的值一旦绑定则不可以再修改。

由于常量的值一旦绑定则不可再修改,所以也就是说对常量二次赋值时需要抛出异常。因此我们显然需要改写自定义的常量类的赋值方法。在 Python 中,当我们对类的属性进行赋值时,会自动调用 object 类的 __setattr__() 函数,该函数的定义如下:

object.__setattr__(self, name, value)

其中的 name 表示属性的名称,value 是试图赋值给 name 的值,其中 object 类的 object.__dict__ 以字典的形式保存了所有已赋值的属性。

因此我们可以通过定义一个常量类 constant 类(默认继承自object),并对 object.__setattr__() 方法进行重写。由于常量有两条规则,所以我们需要根据这两条规则自定义两个异常处理,分别是二次赋值的异常处理和名称非大写的异常处理。

异常处理的定义方式请参看:Python 错误和异常

定义常量类:

constant.py

import sys

class _const:
    # 自定义异常处理
    class ConstError(PermissionError):
        pass
    class ConstCaseError(ConstError):
        pass
    # 重写 __setattr__() 方法
    def __setattr__(self, name, value):
        if name in self.__dict__:  # 已包含该常量,不能二次赋值
            raise self.ConstError("Can't change const {0}".format(name))
        if not name.isupper():  # 所有的字母需要大写
            raise self.ConstCaseError("const name {0} is not all uppercase".format(name))
        self.__dict__[name] = value

# 将系统加载的模块列表中的 constant 替换为 _const() 实例
sys.modules[__name__] = _const()

在其它文件中定义常量,test.py

import constant
constant.VALUE = 5
constant.VALUE = 4  # ConstError
constant.vaLue = 1  # ConstCaseError

当我们识图修改常量 VALUE 的值或者定义一个名称不是全部大写的常量时,都会抛出异常,这样就达到了不可更改常量的值的目的。

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)

文心AIGC

2024 年 8 月
 1234
567891011
12131415161718
19202122232425
262728293031  
文心AIGC
文心AIGC
人工智能ChatGPT,AIGC指利用人工智能技术来生成内容,其中包括文字、语音、代码、图像、视频、机器人动作等等。被认为是继PGC、UGC之后的新型内容创作方式。AIGC作为元宇宙的新方向,近几年迭代速度呈现指数级爆发,谷歌、Meta、百度等平台型巨头持续布局
文章搜索
热门文章
潞晨尤洋:日常办公没必要上私有模型,这三类企业才需要 | MEET2026

潞晨尤洋:日常办公没必要上私有模型,这三类企业才需要 | MEET2026

潞晨尤洋:日常办公没必要上私有模型,这三类企业才需要 | MEET2026 Jay 2025-12-22 09...
反超Nano Banana!OpenAI旗舰图像生成模型上线

反超Nano Banana!OpenAI旗舰图像生成模型上线

反超Nano Banana!OpenAI旗舰图像生成模型上线 Jay 2025-12-17 10:25:43 ...
“昆山杯”第二十七届清华大学创业大赛决赛举行

“昆山杯”第二十七届清华大学创业大赛决赛举行

“昆山杯”第二十七届清华大学创业大赛决赛举行 一水 2025-12-22 17:04:24 来源:量子位 本届...
人车家全生态持续破圈,小米宣布对开发者开放小米MiMo大模型、CarIoT硬件生态

人车家全生态持续破圈,小米宣布对开发者开放小米MiMo大模型、CarIoT硬件生态

人车家全生态持续破圈,小米宣布对开发者开放小米MiMo大模型、CarIoT硬件生态 量子位的朋友们 2025-...
最新评论
ufabet ufabet มีเกมให้เลือกเล่นมากมาย: เกมเดิมพันหลากหลาย ครบทุกค่ายดัง
tornado crypto mixer tornado crypto mixer Discover the power of privacy with TornadoCash! Learn how this decentralized mixer ensures your transactions remain confidential.
ดูบอลสด ดูบอลสด Very well presented. Every quote was awesome and thanks for sharing the content. Keep sharing and keep motivating others.
ดูบอลสด ดูบอลสด Pretty! This has been a really wonderful post. Many thanks for providing these details.
ดูบอลสด ดูบอลสด Pretty! This has been a really wonderful post. Many thanks for providing these details.
ดูบอลสด ดูบอลสด Hi there to all, for the reason that I am genuinely keen of reading this website’s post to be updated on a regular basis. It carries pleasant stuff.
Obrazy Sztuka Nowoczesna Obrazy Sztuka Nowoczesna Thank you for this wonderful contribution to the topic. Your ability to explain complex ideas simply is admirable.
ufabet ufabet Hi there to all, for the reason that I am genuinely keen of reading this website’s post to be updated on a regular basis. It carries pleasant stuff.
ufabet ufabet You’re so awesome! I don’t believe I have read a single thing like that before. So great to find someone with some original thoughts on this topic. Really.. thank you for starting this up. This website is something that is needed on the internet, someone with a little originality!
ufabet ufabet Very well presented. Every quote was awesome and thanks for sharing the content. Keep sharing and keep motivating others.
热评文章
反超Nano Banana!OpenAI旗舰图像生成模型上线

反超Nano Banana!OpenAI旗舰图像生成模型上线

反超Nano Banana!OpenAI旗舰图像生成模型上线 Jay 2025-12-17 10:25:43 ...
英伟达护城河又宽了!低调收购开源算力调度王牌工具,全球过半顶级超算在用,Thinking Machines也离不开它

英伟达护城河又宽了!低调收购开源算力调度王牌工具,全球过半顶级超算在用,Thinking Machines也离不开它

英伟达护城河又宽了!低调收购开源算力调度王牌工具,全球过半顶级超算在用,Thinking Machines也离...
英伟达护城河又宽了!低调收购开源算力调度王牌工具,全球过半顶级超算在用,Thinking Machines也离不开它

英伟达护城河又宽了!低调收购开源算力调度王牌工具,全球过半顶级超算在用,Thinking Machines也离不开它

英伟达护城河又宽了!低调收购开源算力调度王牌工具,全球过半顶级超算在用,Thinking Machines也离...
是个公司都在用AI Agent,但大家真的用明白了吗| MEET2026圆桌论坛

是个公司都在用AI Agent,但大家真的用明白了吗| MEET2026圆桌论坛

是个公司都在用AI Agent,但大家真的用明白了吗| MEET2026圆桌论坛 一水 2025-12-17 ...
人车家全生态持续破圈,小米宣布对开发者开放小米MiMo大模型、CarIoT硬件生态

人车家全生态持续破圈,小米宣布对开发者开放小米MiMo大模型、CarIoT硬件生态

人车家全生态持续破圈,小米宣布对开发者开放小米MiMo大模型、CarIoT硬件生态 量子位的朋友们 2025-...