Kaedah 'Persendirian' Python: Membongkar Mitos Enkapsulasi
Bertentangan dengan namanya, kaedah 'peribadi' Python tidak sepenuhnya peribadi. Semasa menambahkan garis bawah ganda pada nama kaedah (cth., __myPrivateMethod()) mencipta ilusi privasi, Python mendedahkan kaedah ini melalui kaedah yang dijana secara dinamik dengan nama yang diubah suai.
Pertimbangkan kod berikut:
class MyClass: def myPublicMethod(self): print('public method') def __myPrivateMethod(self): print('this is private!!') obj = MyClass()
Memanggil obj.myPublicMethod() berjaya menggunakan kaedah awam. Walau bagaimanapun, percubaan untuk memanggil obj.__myPrivateMethod() menghasilkan AttributeError.
Menyelidiki perkara ini dengan lebih mendalam dengan dir(obj), kami menemui kaedah baharu:
dir(obj) # Output: ['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
Ini dijana secara dinamik kaedah, bernama _MyClass__myPrivateMethod, mengekalkan rujukan kepada yang dikatakan peribadi kaedah.
Walaupun namanya berebut-rebut, tujuannya bukan untuk menghalang akses luaran yang disengajakan. Sebaliknya, ia memastikan bahawa subkelas tidak secara tidak sengaja menimpa kaedah peribadi dan atribut superclass. Pertimbangkan contoh berikut:
class Foo(object): def __init__(self): self.__baz = 42 def foo(self): print(self.__baz) class Bar(Foo): def __init__(self): super(Bar, self).__init__() self.__baz = 21 def bar(self): print(self.__baz) x = Bar() x.foo() # Output: 42 x.bar() # Output: 21 print(x.__dict__) # Output: {'_Bar__baz': 21, '_Foo__baz': 42}
Subkelas masih boleh mengakses atribut atau kaedah peribadi yang ditindih melalui nama yang diubah suai.
Ringkasnya, kaedah 'peribadi' Python tidak benar-benar peribadi dalam rasa prinsip pengaturcaraan berorientasikan objek. Ia hanyalah satu mekanisme untuk mengelakkan penindasan yang tidak disengajakan, tetapi ia tidak menawarkan perlindungan terhadap akses luaran yang disengajakan.
Atas ialah kandungan terperinci Adakah Enkapsulasi Kaedah 'Persendirian' Python Mitos?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!