Private Method

Seperti kebanyakan bahasa pemrograman lain, python juga memiliki private functions, yaitu function yang tidak dapat dipanggil dari luar modulenya. Private function terdiri dari, method private (tidak dapat dipanggil dari luar class-nya) & attribute private ( yang tidak dapat diakses dari luar class-nya). Uniknya adalah penetuan baik private ataupun public dalam python ditentukan sepenuhnya oleh namanya, tidak seperti bahasa pemrograman lain yang mengharuskan memberi nilai private sebelum nama methodnya.

Ada beberapa point penting dalam private method :

1. Jika sebuah nama function python, baik method maupun attribut hanya diawali -tetapi tidak diakhiri- dengan 2 underscore (__), berarti method atau attribut tsb adalah PRIVATE, selainnya adalah public.

2. Pada python, semua special methods (seperti __init__) dan built-in attribut (seperti __doc__)  mengikuti standar penamaan kesepakatan konfrensi (diawali & diakhiri dgn 2 underscore). Dilarang untuk memberikan nama method/attribut yang kita buat, seperti itu (double underscore di awal & akhir) sama seperti halnya kata2 kunci pada python yang tidak boleh digunakan sebagai attribut maupun method (seperti True, list, del, string, dll)

3. Python tidak memiliki konsep Protected Method -sebagaimana dalam java dll- (yang dapat diakses oleh class itu sendiri atau turunannya). Method dalam python hanya ada 2, yaitu Private (hanya bisa dipanggil dari class-nya) & Public (bisa dipanggil dari mana saja) .

Contoh codenya :

class Mobil:
    def __init__(self):
        print 'ini adalah special method pada class Mobil, yaitu constructor'
        self.__method_private() # Memanggil private method
        self.method_public() # Memanggil public method

    def __method_private(self):
        print 'Ini adalah method private, yaitu hanya bisa dipanggil dari class Mobil'

    def method_public(self):
        print 'Ini adalah method biasa alias public, yaitu bisa diakses dari mana saja'

class Rumah:
    def __init__(self):
        print 'ini adalah special method pada class Rumah, yaitu constructor'

object_mobil = Mobil()
object_mobil.method_public() # Kita mengakses method public --> pasti bisa
object_mobil.__method_private() # Hasilnya pasti ERROR

# Kita akan membuktikan memanggil private method di class yang lain (class RUmah), hasilnya akan ERROR

objek_mobil = Mobil()

Hasil outputnya :

Ini adalah special method pada class Mobil, yaitu constructor
Ini adalah method private, yaitu hanya bisa dipanggil dari class Mobil
Ini adalah method biasa alias public, yaitu bisa diakses dari mana saja

# Ketika memanggil private method di class yang bukan Mobil

objek_rumah = Rumah()

Hasil outputnya :

ini adalah special method pada class Rumah, yaitu constructor

# Perintah ini keluar ketika kita membuat object class Mobil di constructor class Rumah


Ini adalah special method pada class Mobil, yaitu constructor
Ini adalah method private, yaitu hanya bisa dipanggil dari class Mobil
Ini adalah method biasa alias public, yaitu bisa diakses dari mana saja

# Perintah ini keluar karna kita memanggi public method class Mobil
Ini adalah method biasa alias public, yaitu bisa diakses dari mana saja

# Error ini keluar ketika kita memanggil private method class Mobil
Traceback (most recent call last):
File "", line 1, in
File "", line 6, in __init__
AttributeError: Mobil instance has no attribute '_Rumah__method_private'

HINTS :

Sebenarnya, private method dapat diakses dari selain class-nya, tetapi tidak semudah mengakses public method. Tidak ada yang benar2 private di python. Lebih dalam lagi, penamaan private baik method maupun attribut adalah mangled and unmangled on the fly to make them seem inaccessible by their given names. Kita bisa mengakses private method pada class Rumah diatas dengan perintah :

object_mobil._Mobil__method_private()

Jadinya seperti ini :

class Rumah:
    def __init__(self):
        object_mobil = Mobil()
        object_mobil.method_public()
        object_mobil._Mobil__method_private()

Ada suatu pesan yang indah yang jika seandainya saya terjemahkan kurang elok 😀 , yaitu :

“Private methods are private for a reason, but like many other things in Python, their privateness is ultimately a matter of convention, not force.”

Oh ya ada satu tambahan lagi (beda 1 underscore & 2 underscore):
__method__: this is just a convention, a way for the Python system to use names that won’t conflict with user names.

_method: this is just a convention, a way for the programmer to indicate that the variable is private (whatever that means in Python).

__method: this has real meaning: the interpreter replaces this name with _classname__foo as a way to ensure that the name will not overlap with a similar name in another class.
http://stackoverflow.com/questions/1301346/the-meaning-of-a-single-and-a-double-underscore-before-an-object-name-in-python

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s