Enigma Garis Bawah Berganda Python: Janji Privasi Palsu
Walaupun terdapat garis bawah berganda, kaedah "peribadi" Python, secara mengejutkan, tidak sepenuhnya peribadi. Paradoks yang jelas ini timbul daripada pendekatan unik Python untuk enkapsulasi.
Apabila garis bawah berganda memberi awalan kaedah atau nama pembolehubah, Python mentafsirkannya sebagai penunjuk untuk menukar nama. Daripada menggunakan nama asal, ia menggabungkan garis bawah, nama kelas dan nama asal. Contohnya, __myPrivateMethod menjadi _MyClass__myPrivateMethod.
Teknik perebutan nama ini mempunyai tujuan: ia menghalang subkelas daripada mengatasi kaedah peribadi dan atribut yang diwarisi daripada superclass mereka secara tidak sengaja. Pertimbangkan contoh:
class Foo(object): def __init__(self): self.__baz = 42 def foo(self): print self.__baz
Jika subkelas, Bar, mentakrifkan ahli dengan nama yang sama dengan ahli persendirian kelas supernya, mekanisme perebutan nama Python memastikan mereka kekal berbeza dan mengelakkan kemungkinan konflik.
Walau bagaimanapun, teknik ini tidak menghalang akses yang disengajakan kepada ahli persendirian dari luar kelas. Seperti yang ditunjukkan oleh contoh di bawah, seseorang boleh terus mengakses ahli persendirian yang dinamakan semula menggunakan nama yang diubah:
x = Foo() print x._Foo__baz # Output: 42
Oleh itu, sementara konvensyen garis bawah berganda Python mencipta ilusi privasi, ia akhirnya merupakan bentuk pengkapsulan yang lemah. Ia menghalang kaedah yang tidak disengajakan oleh subkelas, tetapi ia tidak dapat melindungi daripada akses yang disengajakan daripada entiti luaran.
Atas ialah kandungan terperinci Adakah Notasi Garis Bawah Berganda Python adalah Bentuk Privasi Data Sebenar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!