|
228 | 228 |
|
229 | 229 |
|
230 | 230 |
|
| 231 | +انتزاع (Abstraction) |
| 232 | +---------------------------------- |
231 | 233 |
|
| 234 | +انتزاع یا تجرید یا Abstraction در شی گرایی فرآیندی است که طی آن تنها ویژگیهای اصلی، آنهم بدون پیادهسازی جزییات ارايه میگردد. در واقع **Abstraction** برابر است با **Implementation hiding**. این مفهوم همراه با موجودیت کلاس تعریف میشود. کلاسهای Abstrac، از درس پنجم به یاد داریم که دو نوع کلاس در شیگرایی وجود دارد: ۱- کلاسهای عادی که توانایی نمونهسازی دارند و به آنها **”Concrete Class“** گفته میشود ۲- کلاسهایی که توانایی نمونهسازی ندارند و به آنها **”Abstract Class“** گفته میشود. |
232 | 235 |
|
| 236 | +«کلاس Abstract» کلاسی است که شامل یک یا چند «متد Abstract» باشد و «متد Abstract» متدی است که اعلان (Declare) شده ولی بدنه آن تعریف (Define) نشده است. کلاسهای Abstract قابلیت نمونهسازی ندارند و نمیتوان از آنها شی ایجاد نمود؛ چرا که هدف از توسعه آنها قرار گرفتن در بالاترین سطح (یا چند سطح بالایی) سلسلهمراتب وراثت، به عنوان کلاس پایه برای ارثبری کلاسهای پایینتر میباشد. در واقع ایده طراحی کلاس Abstract در تعیین یک نقشه توسعه برای subclassها میباشد. |
233 | 237 |
|
| 238 | +در زبان برنامهنویسی پایتون، Abstraction از طریق ماژول ``abc`` ارايه میشود [`اسناد پایتون <https://docs.python.org/3/library/abc.html>`__]. این ماژول دو راه برای ایجاد کلاس Abstract فراهم آورده است: |
234 | 239 |
|
| 240 | +۱- با استفاده از متا کلاس ``ABCMeta`` [`اسناد پایتون <https://docs.python.org/3/library/abc.html#abc.ABCMeta>`__]: |
235 | 241 |
|
236 | | -انتزاع (Abstraction) |
237 | | ----------------------------------- |
| 242 | +.. code-block:: python |
| 243 | + :linenos: |
| 244 | + |
| 245 | + from abc import ABCMeta, abstractmethod |
| 246 | +
|
| 247 | + class MyABC(metaclass=ABCMeta): |
| 248 | + |
| 249 | + @abstractmethod |
| 250 | + def abs_instance_method(self): |
| 251 | + pass |
| 252 | + |
| 253 | + @classmethod |
| 254 | + @abstractmethod |
| 255 | + def abs_class_method(cls): |
| 256 | + pass |
| 257 | + |
| 258 | + @staticmethod |
| 259 | + @abstractmethod |
| 260 | + def abs_static_method(): |
| 261 | + pass |
| 262 | +
|
| 263 | +۲- با استفاده از ارثبری کلاس ``ABC`` [`اسناد پایتون <https://docs.python.org/3/library/abc.html#abc.ABC>`__]، ``ABC`` یک کلاس کمکی است که متا کلاس آن ``ABCMeta`` میباشد و از نسخه 3.4 به پایتون افزوده شده است: |
| 264 | + |
| 265 | + |
| 266 | +.. code-block:: python |
| 267 | + :linenos: |
| 268 | + |
| 269 | + from abc import ABC, abstractmethod |
| 270 | +
|
| 271 | + class MyABC(ABC): |
| 272 | + |
| 273 | + @abstractmethod |
| 274 | + def abs_instance_method(self): |
| 275 | + pass |
| 276 | + |
| 277 | + @classmethod |
| 278 | + @abstractmethod |
| 279 | + def abs_class_method(cls): |
| 280 | + pass |
| 281 | + |
| 282 | + @staticmethod |
| 283 | + @abstractmethod |
| 284 | + def abs_static_method(): |
| 285 | + pass |
| 286 | +
|
| 287 | +
|
| 288 | +
|
| 289 | +.. tip:: |
| 290 | + |
| 291 | + در زبان برنامهنویسی پایتون: |
| 292 | + |
| 293 | + * کلاسهای Abstract میتوانند علاوه بر متدهای Abstract، شامل متدهای معمولی که پیشتر شرح داده شد نیز باشند. |
238 | 294 |
|
| 295 | + * نمیتوان از کلاسهای Abstract شی ایجاد کرد، این نوع کلاس فاقد عملیات نمونهسازی میباشد. |
| 296 | + |
| 297 | + * متدهای Abstract با استفاده از دکوراتور ``abstractmethod@`` از ماژول ``abc`` ایجاد میگردد. |
| 298 | + |
| 299 | + * متدهای Abstract مانند هر متدی دیگری در پایتون میتوانند از انواع Instance Method یا Class Method یا Static Method باشند. |
239 | 300 |
|
240 | 301 |
|
241 | 302 | | |
|
0 commit comments