博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[问题解决] Python实现final这个功能
阅读量:5817 次
发布时间:2019-06-18

本文共 2629 字,大约阅读时间需要 8 分钟。

  hot3.png

今天在学习设计模式的时候突发奇想,可不可以实现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.pyClass FatherTraceback (most recent call last):  File "F:/PythonSpace/ClassMethod/test.py", line 16, in 
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):  #删除后就不会报错        passif __name__ == '__main__':    f = Father()    f.show()    s = Son()    s.show()

运行结果:

E:\Anaconda\python.exe F:/PythonSpace/ClassMethod/test.pyTraceback (most recent call last):Class Father  File "F:/PythonSpace/ClassMethod/test.py", line 17, in 
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 = 2if __name__ == '__main__':    f = Father()

运行结果:

E:\Anaconda\python.exe F:/PythonSpace/ClassMethod/test.pyTraceback (most recent call last):  File "F:/PythonSpace/ClassMethod/test.py", line 14, in 
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.

结束语

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

转载于:https://my.oschina.net/gain/blog/3001487

你可能感兴趣的文章
微信公众号与APP微信第三方登录账号打通
查看>>
onchange()事件的应用
查看>>
Windows 下最佳的 C++ 开发的 IDE 是什么?
查看>>
软件工程师成长为架构师必备的十项技能
查看>>
python 异常
查看>>
百度账号注销
查看>>
C# 单机Window 程序 sqlite 数据库实现
查看>>
mysql-This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
查看>>
BIEE Demo(RPD创建 + 分析 +仪表盘 )
查看>>
Cocos2dx 3.0开发环境的搭建--Eclipse建立在Android工程
查看>>
基本概念复习
查看>>
重构第10天:提取方法(Extract Method)
查看>>
Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
查看>>
解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题
查看>>
“Info.plist” couldn’t be removed
查看>>
多线程day01
查看>>
react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
查看>>
MySQL出现Access denied for user ‘root’@’localhost’ (using password:YES)
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>