当前位置: 首页 > news >正文

Python中五个不常见的隐晦用法小结

1. 引言

我已经用Python编程5年了(从2017年开始),直到最近才知道以下几个Python中不常见的用法,确实和人们对直观理解有所出入。

闲话少说,我们直接开始吧!

2. 类中的私有变量不是真正的私有

我们直接上例子,如下:

class Dog():def __init__(self, name):self.__name = name@propertydef name(self):return self.__name

在这个Dog类中,__name属性有getter方法,但没有setter方法。按照一般理解,我们作为用户应该只能通过成员函数name()来读取属性__name的值,而无法直接为Dog对象设置新的名称。但该私有变量并不是那么私有。

dog = Dog("rocky")
print(dog.__dict__)   # {'_Dog__name': 'rocky'}

如上所示,类的__dict__属性包含了该对象的所有属性。通过使用__dict__属性,我们甚至可以控制哪些不应该访问的私有变量和属性。
样例如下:

dog.__dict__["_Dog__name"] = "fifi"
print(dog.name)
# fifi 

3. Python中的无穷用法

我们使用关键之inf来表示无穷大,代码如下:

a = float("inf")
b = float("-inf")
print(a, b)   # inf -inf

我们可以在Python中创建无穷大(和无穷小)的值。每个可显示表示的数值都小于inf且大于-inf,如下:

print(10**100000 > float("inf"))      # False
print(-(10**10000) < float("-inf"))   # False

4. 可以使用类作为装饰器

假设我们有一个简单的函数,用来实现向某人问好的功能:

def hello(name):return "hello " + name
print(hello("fifi"))    # hello fifi

让我们编写decorator类,并在定义hello函数时使用它,如下:

class append():def __init__(self, char):self.char = chardef __call__(self, function):def inner(*args):return function(*args) + self.charreturn inner
@append("!")
def hello(name):return "hello " + name
print(hello("fifi"))    # hello fifi!

我们也可以在一个函数上使用多次修饰器:

@append("?")
@append("!")
def hello(name):return "hello " + name
print(hello("fifi"))    # hello fifi!?

5. 汉字用作变量名

哈哈哈,在Python中也可以使用汉字作为变量名,举例如下:

= 4= 5
print(+)    # 9

我没有尝试过使用Python语言中的这个特性,但如果你尝试了,请告诉我。虽然这不是一个非常有用的知识(除非你真的想惹同事生气)。

6. 使用eval()在字符串中运行Python代码

我们可以使用Python内置的eval()函数来以字符串的形式运行Python代码,代码如下:

x = 4
y = eval("x + 10")
print(y)    # 14

一个更复杂的例子如下:

string = "print('hello world')"
eval(string)  # prints hello world
string = "1+2+3"
eval(string)  # returns 6

7. 总结

我直到最近才知道上述这些在Python中不常见的用法(我可能早该知道,但事实就是这样), 希望这篇文章可以给大家带来帮助。

参考

http://www.lryc.cn/news/2883.html

相关文章:

  • SharkTeam:Move合约开发与合约安全
  • 一篇文章学习什么是进程(万字解析,超多知识点)
  • 第01章_数据库概述
  • 我所理解的高通UEFI之display的流程和移植
  • iozone -a fsync: I/O error
  • Element UI框架学习篇(五)
  • SpringBoot 全局异常处理用法及原理
  • 浏览器中HTTP请求流程是如何处理的
  • 【Pytorch项目实战】之语义分割:U-Net、UNet++、U2Net
  • 七、插件机制
  • kmp算法
  • 【Python】正则表达式简单教程
  • SAP ABAP Odata
  • Android native ASAN 排查内存泄漏
  • Django项目开发
  • Debezium系列之:深入理解Debezium Server和Debezium Server实际应用案例详解
  • IDE2022源码编译tomcat
  • 214 情人节来袭,电视剧 《点燃我温暖你》李峋同款 Python爱心表白代码,赶紧拿去用吧
  • 数据库范式
  • CUDA中的底层驱动API
  • 【博客616】prometheus staleness对PromQL查询的影响
  • 多传感器融合定位十三-基于图优化的建图方法其二
  • linux 服务器线上问题故障排查
  • Sandman:一款基于NTP协议的红队后门研究工具
  • 【SSL/TLS】准备工作:HTTPS服务器部署:Nginx部署
  • 微搭低代码从入门到精通11-数据模型
  • 【算法基础】前缀和与差分
  • LTD212次升级 | 官网社区支持PC端展示 • 官网新增证件查询应用,支持条形码扫码查询
  • 【安全】nginx反向代理+负载均衡上传webshell
  • 线程池框架