کدستانِ من

  • ۰
  • ۰

در بعضی زبان های برنامه نویسی مثل جاوا و ++C دسترسی به منابع با کلمات کلیدی private، public و protected کنترل می شوند. یکی از اهداف این کار محصورسازی داده ها (data encapsulation) در زبان های شی گرا است.
اعضای
public کلاس اعضایی هستند که هرچند در کلاس تعریف می شوند ولی از بیرونٍ کلاس قابل دسترسی هستند.
اعضای
private اعضایی هستند که محدود به کلاسی هستند که در آن تعریف می شوند و امکان دسترسی به آن ها از طریق بیرون کلاس وجود ندارد.
اعضای
protected نیز از خارج از کلاس قابل دسترسی نیستند ولی زیرکلاس ها اجازه ی دسترسی به آن ها را دارند.

 

در این میان زبان پایتون ساز و کار موثری برای پیاده سازی اعضای private، public و protected ندارد. پایتون با کمک روش پیشوندگذاری اعضا مکانیزم عدم دسترسی به اعضا را شبیه سازی می کند ولی در واقعیت این کار، عمل محدودکردن دسترسی را انجام نمی دهد. پایتون درعمل دسترسی به داده های private و protected را محدود نمی کند و فقط برنامه نویسان را به این کار متعهد کرده است. در واقع خود برنامه نویسان با دیدن پیشوندهای مشخص کننده ی اعضای private و protected باید از دسترسی و تغییر آن ها پرهیز کنند.

 

اعضا در پایتون به صورت پیش فرض public هستند. اعضای public از خارج از کلاس قابل دسترسی هستند.


class Foo:
    def __init__(self, x):
        self.x = x

در این مثال x یک عضو public است که از خارج از کلاس قابل دسترسی و تغییر است.


>>> foo = Foo(10)
>>> foo.x
10
>>> foo.x = 222
>>> foo.x
222

قرارداد پایتون برای تعریف اعضای protected اضافه کردن _ (زیرین خط یا underscore) است. این تعریف دسترسی به عضو را به جز برای خود کلاس و زیرکلاس های آن ممنوع می کند.


class MathTest:
    def __init__(self, a, b):
        self.first_number = a
        self.second_number = b

    def _add(self):
        return self.first_number + self.second_number

    def print_sum(self):
        sum = self._add()
        print('Sum of {} and {} is {}'.format(self.first_number, self.second_number, sum))

البته در واقعیت مثال بالا دسترسی به متد add که protected است را منع نمی کند و هنوز هم امکان انجام عملیات زیر خارج از کلاس وجود دارد!


>>> test = MathTest(10,20)
>>> test.print_sum()
Sum of 10 and 20 is 30
>>> test2 = MathTest(111,222)
>>> print(test2._add())
333

با اینحال همانطور که گفته شد پایتون برنامه نویسان مسئول را از دسترسی و تغییر اعضای protected منع کرده است و آن ها را متعهد به این کار کرده است.

 

اعضای private در پایتون با __ (دو زیرین خط یا دو underscore) تعریف می شوند. با اینکار دسترسی به آن ها خارج از کلاس ممنوع می باشد.


class Employee:
    def __init__(self, name, salary):
        self.__name = name
        self.__salary = salary

تفاوتی که این حالت با مثال پیش دارد این است که دسترسی مستقیم به متغیرهای private وجود ندارد و دسترسی زیر موجب ایجاد خطای AttributeError می شود.


>>> employee = Employee('John Doe', 20000)
>>> employee.__salary 
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: Employee instance has no attribute '__salary'

با اینحال اعضای private باز هم خارج از کلاس قابل دسترسی هستند. وجود __ این اعضا را به به متغیرهای object__variablename_ تبدیل می کند. بنابراین اعضای private را می شود به صورت زیر دید و تغییر داد هرچند باید از این کار پرهیز کرد.


>>> employee = Employee('Anna Bole', 30000)
>>> employee._Employee__salary
30000
>>> employee._Employee__salary = 44400
>>> employee._Employee__salary
44400

همانطور که گفته شد در برخی زبان های برنامه نویسی امکان تعریف اعضای private، public و protected با کلمات کلیدی وجود دارد. این کلمات کلیدی عملا دسترسی به اعضا را محدود یا از آن جلوگیری می کنند. در پایتون نیز به صورت قراردادی برای تعریف اعضای protected از _ و اعضای private از __ استفاده می شود. این تعریف های قراردادی در عمل مانع از دسترسی به اعضا نمی شوند ولی پایتون برنامه نویسان را متعهد و مسئول این کار می داند و آن ها را از دسترسی و تغییر اعضای private و protected خارج از کلاس منع می کند.

 

نظرات (۱)

مرسی .

عالی بود.

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی