259 字
1 分钟
python中的下划线
下划线
python中的下划线有很多,常见的就是魔术方法比如__init__这种。
通过下划线可以实现类似c++的公有成员,私有成员,保护成员
`__foo__`:一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突,就是例如:`__init__()`,`__del__()`,`__call__()` 这些特殊方法;_foo(单下划线):官方定义:受保护的成员 (Protected)。实际效果:屁用没有! Python 解释器完全不会阻止你访问它。__foo(双下划线):私有变量,不让访问与修改!python是如何实现的?为了拦着你! Python 解释器会玩个花招,叫 名称改写 (Name Mangling)。案例
class Fatdog: def __init__(self): self.__fat = "很胖" #这个才是真的私有变量! self._dog = "胖狗"#受保护的变量dog = Fatdog()try: print(dog._dog) dog._dog="小胖狗" print(dog._dog) print(dog.__fat)except Exception as e: print(e) #报错(AttributeError: 'Fatdog' object has no attribute '__fat')#使用双下划线会被python名称改写,从而引发报错#名称改写规则是__foo → _当前类名__foo#怎么强行访问?(黑客模式) 🕵️♂️print(dog._Fatdog__fat)print(Fatdog.__dict__)#输出胖狗小胖狗'Fatdog' object has no attribute '__fat'很胖{'__module__': '__main__', '__firstlineno__': 12, '__init__': <function Fatdog.__init__ at 0x00000212446339C0>, '__static_attributes__': ('__fat', '_dog'), '__dict__': <attribute '__dict__' of 'Fatdog' objects>, '__weakref__': <attribute '__weakref__' of 'Fatdog' objects>, '__doc__': None}小胖狗这个_dog有啥用?他是受保护的变量,也就是开发者之间相互约定好的,不要随意外部访问。虽然说是保护,但是你照样可以随便蹂躏他(不过这样会显得你没素质🤪)
至于私有变量__fat,它是为了防止子类意外覆盖父类的属性,或者是为了防止外部随意修改核心数据。
它不是绝对的安全(毕竟还能通过 _类名__变量名 访问),但它足够让正常人知难而退。
所以说还是那句话,这个世界上,只要是人为制造的困难,就一定要解决办法。再强的项目,总会有漏洞存在。

python中的下划线
https://mizuki.mysqil.com/posts/xiahuaxian/ 部分信息可能已经过时









