Rumah >pembangunan bahagian belakang >Tutorial Python >Adakah Enkapsulasi Kaedah 'Persendirian' Python Mitos?

Adakah Enkapsulasi Kaedah 'Persendirian' Python Mitos?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-05 19:16:11879semak imbas

Is Python's

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn