文档章节

[问题解决] Python实现final这个功能

Eappo_Geng
 Eappo_Geng
发布于 01/14 23:40
字数 617
阅读 7
收藏 0

今天在学习设计模式的时候突发奇想,可不可以实现JAVA中的一些内容呢?

比如 final。

final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。

修饰类

当用final修饰一个类时,表明这个类不能被继承。

class Father(object):
    def __new__(cls, *args, **kwargs):
        if cls != Father:
            raise Exception('This class cannot be inherited.')
        return super(Father, cls).__new__(cls, *args, **kwargs)

    def __init__(self):
        print("Class Father")

class Son(Father):
    def __init__(self):
        print('Class Son')

if __name__ == '__main__':
    f = Father()
    s = Son()

运行结果:

E:\Anaconda\python.exe F:/PythonSpace/ClassMethod/test.py
Class Father
Traceback (most recent call last):
  File "F:/PythonSpace/ClassMethod/test.py", line 16, in <module>
    s = Son()
  File "F:/PythonSpace/ClassMethod/test.py", line 4, in __new__
    raise Exception('This class cannot be inherited.')
Exception: This class cannot be inherited.

修饰方法

明确禁止该方法在子类中被覆盖。

class Father(object):
    def __new__(cls, *args, **kwargs):
        if cls != Father and 'show' in cls.__dict__.keys():
            raise Exception('This method cannot be rewritten.')
        return super(Father, cls).__new__(cls, *args, **kwargs)

    def show(self):
        print("Class Father")

class Son(Father):
    def show(self):  #删除后就不会报错
        pass

if __name__ == '__main__':
    f = Father()
    f.show()
    s = Son()
    s.show()

运行结果:

E:\Anaconda\python.exe F:/PythonSpace/ClassMethod/test.py
Traceback (most recent call last):
Class Father
  File "F:/PythonSpace/ClassMethod/test.py", line 17, in <module>
    s = Son()
  File "F:/PythonSpace/ClassMethod/test.py", line 4, in __new__
    raise Exception('This method cannot be rewritten.')
Exception: This method cannot be rewritten.

修饰变量

对于一个final变量,其数值一旦在初始化之后便不能更改。

class Father(object):
    __final = 1
    def __setattr__(self, key, value):
        if key == '_Father__final':
            raise Exception('Property cannot be changed after initialization.')
        else:
            self.__dict__[key] = value

    def __init__(self):
        self.__final = 2


if __name__ == '__main__':
    f = Father()

运行结果:

E:\Anaconda\python.exe F:/PythonSpace/ClassMethod/test.py
Traceback (most recent call last):
  File "F:/PythonSpace/ClassMethod/test.py", line 14, in <module>
    f = Father()
  File "F:/PythonSpace/ClassMethod/test.py", line 10, in __init__
    self.__final = 2
  File "F:/PythonSpace/ClassMethod/test.py", line 5, in __setattr__
    raise Exception('Property cannot be changed after initialization.')
Exception: Property cannot be changed after initialization.

结束语

以上只是本人观点,难免有不足之处,只做参考,不做考究。

© 著作权归作者所有

共有 人打赏支持
Eappo_Geng
粉丝 4
博文 77
码字总数 70206
作品 0
徐汇
程序员
私信 提问
大神整理的python资源大全

Python基本安装: http://www.python.org/ 官方标准Python开发包和支持环境,同时也是Python的官方网站; http://www.activestate.com/ 集成多个有用插件的强大非官方版本,特别是针对Windo...

openthings
2015/12/15
0
0
hi,大家好,我是pyui4win开源项目的发起者,欢迎大家关注该项目

pyui4win开源项目 目标:python做高效windows开发 20130721 增加编译为python扩展包,支持原生python调用 20130717 支持多线程运行 20130717 加入checkbox 20130617 新增饼图控件 20130613 新...

编码的风景
2013/07/21
0
6
Python 开发者的 6 个必备库

无论你是正在使用 Python 进行快速开发,还是在为 Python 桌面应用制作原生 UI ,或者是在优化现有的 Python 代码,以下这些 Python 项目都是应该使用的。 Python 凭借其易用的特点,已经被工...

oschina
2017/10/18
4.1K
8
第一个python网络爬虫总结

这个程序其实就是模仿用户的网页访问操作。 先从主页上获取大的商品分类,再一级一级地遍历所有的小分类。在最后得到商品列表,再遍历每个商品页,从商品页是抓取有效的信息。 这里,我对一些...

临峰不畏
2014/12/15
0
0
构建自己的Android账户与内容同步机制,例程SampleSyncAdapter的分析

装过Android版的Facebook、lastfm的同学是否对于这些应用的功能感到惊喜,它们可以定期更新朋友的最新信息,将最新近况和心情短语集成入联系人中。这些应用全部是以Android2.0后的账户和同步...

鉴客
2012/02/21
3.8K
2

没有更多内容

加载失败,请刷新页面

加载更多

看过上百部片子的这个人教你视频标签算法解析

本文由云+社区发表 随着内容时代的来临,多媒体信息,特别是视频信息的分析和理解需求,如图像分类、图像打标签、视频处理等等,变得越发迫切。目前图像分类已经发展了多年,在一定条件下已经...

腾讯云加社区
16分钟前
0
0
2. 红黑树

定义:红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树(Binary Search Tree)。 要理解红黑树,先要了解什么是二叉查找树。在上一章中,我们学习了什么是二叉树,以及二叉树...

火拳-艾斯
17分钟前
0
0
input的button类型,点击页面跳转

一、input type=button 不做任何操作 例如: <input type="button" class="btn btn-primary" style="width: 30%" value="返回" onclick="window.location.href='/users/list'"></input> onc......

Sunki
23分钟前
0
0
踩坑:js 小数运算出现精度问题

背景 在学习小程序商城源码时发现了这个问题,单价可能出现小数,小数之间运算结果会莫名其妙多出一大串数字,比如下面这样👇。 在此之前我是知道 js 中著名的 0.1 + 0.2 != 0.3 的问题的,...

dkvirus
29分钟前
0
0
zookeeper和HBASE总结

zookeeper快速上手 zookeeper的基本功能和应用场景 zookeeper的整体运行机制 zookeeper的数据存储机制 数据存储形式 zookeeper中对用户的数据采用kv形式存储 只是zk有点特别: key:是以路径...

瑞查德-Jack
52分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部