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

Adakah Enkapsulasi Kaedah 'Persendirian' Python Mitos?

Mary-Kate Olsen
Lepaskan: 2024-12-05 19:16:11
asal
879 orang telah melayarinya

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()
Salin selepas log masuk

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']
Salin selepas log masuk

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}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan