|
| 1 | +.. role:: emoji-size |
| 2 | + |
| 3 | +.. meta:: |
| 4 | + :description: کتاب آموزش زبان برنامه نویسی پایتون به فارسی، آموزش شی گرایی در پایتون، OOP در پایتون، انتزاع در پایتون، Abstraction و Metaclass در پایتون، متاکلاس در پایتون |
| 5 | + :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, تابع, کتابخانه, پایتون, شی گرایی در پایتون |
| 6 | + |
| 7 | + |
| 8 | +درس ۱۹: شی گرایی (OOP) در پایتون: Metaclass و Abstraction |
| 9 | +======================================================================================================== |
| 10 | + |
| 11 | + |
| 12 | + |
| 13 | + |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | +:emoji-size:`✔` سطح: متوسط |
| 18 | + |
| 19 | +---- |
| 20 | + |
| 21 | + |
| 22 | +.. contents:: سرفصلها |
| 23 | + :depth: 2 |
| 24 | + |
| 25 | +---- |
| 26 | + |
| 27 | + |
| 28 | +متاکلاس (Metaclass) |
| 29 | +---------------------------------- |
| 30 | + |
| 31 | +**متاکلاس (Metaclass)** [`اسناد پایتون <https://docs.python.org/3/reference/datamodel.html#metaclasses>`__] در پایتون یک مفهوم پنهان در رابطه با پیادهسازی برنامهنویسی شی گرا میباشد. اکثر برنامهنویسها چه از آن آگاه باشند و چه خیر، به ندرت از آن استفاده میکنند و شاید شما هیچگاه نیاز به استفاده از این قابلیت نداشته باشید ولی باید بدانید این قابلیتی است که در اکثر زبانهای برنامهنویسی شی گرا ارائه نمیشود! |
| 32 | + |
| 33 | +.. image:: /_static/l19-python-metaclass.png |
| 34 | + :align: center |
| 35 | + :target: https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/ |
| 36 | + |
| 37 | +**متاکلاس چیست؟** یک کلاس است و اشیایی که از آن ایجاد میگردند، کلاسها هستند! بارها گفته شد که «هر چیزی در پایتون یک شی است» و این جمله حتی خود موجودیت کلاسها را نیز شامل میشود. با اجرای دستور تعریف کلاس، یک شی از نوع ``type`` در حافظه ایجاد میگردد و از نام کلاس برای اشاره به آن شی استفاده میشود (درس هفدهم). اکنون میتوانیم بگوییم که ``type`` در واقع یک متاکلاس میباشد:: |
| 38 | + |
| 39 | + >>> class MyClassName: |
| 40 | + ... pass |
| 41 | + ... |
| 42 | + >>> obj = MyClassName() |
| 43 | + |
| 44 | + >>> type(obj) |
| 45 | + <class '__main__.MyClassName'> |
| 46 | + |
| 47 | + >>> type(MyClassName) |
| 48 | + <class 'type'> |
| 49 | + |
| 50 | + |
| 51 | + >>> isinstance(obj, MyClassName) |
| 52 | + True |
| 53 | + |
| 54 | + >>> isinstance(MyClassName, type) |
| 55 | + True |
| 56 | + |
| 57 | + |
| 58 | +در نمونه کد بالا، ``MyClassName`` کلاس یا نوع دادهای بود که ما خودمان آن را تعریف کرده بودیم. با این حال جالب است بدانید تمام انواع پیش تعریف شده در پایتون هم از نوع ``type`` هستند، حتی خود ``type``! :: |
| 59 | + |
| 60 | + >>> type(int) |
| 61 | + <class 'type'> |
| 62 | + >>> type(float) |
| 63 | + <class 'type'> |
| 64 | + >>> type(dict) |
| 65 | + <class 'type'> |
| 66 | + >>> type(list) |
| 67 | + <class 'type'> |
| 68 | + >>> type(tuple) |
| 69 | + <class 'type'> |
| 70 | + >>> type(str) |
| 71 | + <class 'type'> |
| 72 | + >>> type(complex) |
| 73 | + <class 'type'> |
| 74 | + >>> type(bool) |
| 75 | + <class 'type'> |
| 76 | + |
| 77 | + >>> type(type) |
| 78 | + <class 'type'> |
| 79 | + |
| 80 | + |
| 81 | +در واقع ``type`` کلاسی است که تمام کلاسهای پایتون به صورت پیشفرض از روی آن ایجاد میگردند. ``type`` یک متا کلاس است و پایتون این قابلیت را به شما میدهد که متا کلاس خودتان را بسازید، بنابراین میتوانید کلاسهایی بسازید که یک شی از متا کلاس شما هستند، هیجان انگیز نیست؟! اکثر زبانهای برنامهنویسی تنها یک پیادهسازی پیشفرض در اختیار برنامهنویس قرار میدهند ولی این قابلیت در پایتون امکانات قدرتمندی برای برنامهنویس فراهم میآورد همچون thread-safety، مدیریت کامل فرآیند ایجاد شی و... |
| 82 | + |
| 83 | +ایجاد متاکلاس |
| 84 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 85 | + |
| 86 | +:: |
| 87 | + |
| 88 | + >>> class SampleMetaClass(type): |
| 89 | + ... pass |
| 90 | + ... |
| 91 | + >>> class Sample(metaclass=SampleMetaClass): |
| 92 | + ... pass |
| 93 | + ... |
| 94 | + >>> |
| 95 | + |
| 96 | + >>> type(SampleMetaClass) |
| 97 | + <class 'type'> |
| 98 | + |
| 99 | + >>> type(Sample) |
| 100 | + <class '__main__.SampleMetaClass'> |
| 101 | + |
| 102 | +برای ایجاد متا کلاس تنها کافی است یک کلاس جدید بسازید که از کلاس ``type`` ارثبری داشته باشد. با ارسال نام این کلاس به پارامتر ``metaclass`` هر کلاس دیگری میتوان به آنها انتساب داد. |
| 103 | + |
| 104 | +بر اساس تعریف ارائه شده در [`اسناد پایتون <https://docs.python.org/3/glossary.html#term-metaclass>`__]، تعریف کلاس (دستور ``class``) باعث ایجاد «نام کلاس»، «یک شی دیکشنری از کلاس» و «یک شی لیست حاوی superclassهای آن کلاس» میشود، متاکلاس این سه آرگومان را دریافت و شی کلاس را ایجاد میکند. |
| 105 | + |
| 106 | + |
| 107 | + |
| 108 | + |
| 109 | +انتزاع (Abstraction) |
| 110 | +---------------------------------- |
| 111 | + |
| 112 | + |
| 113 | + |
| 114 | +| |
| 115 | +
|
| 116 | +---- |
| 117 | + |
| 118 | +:emoji-size:`😊` امیدوارم مفید بوده باشه |
| 119 | + |
| 120 | +`لطفا دیدگاه و سوالهای مرتبط با این درس خود را در کدرز مطرح نمایید. <https://www.coderz.ir/python-tutorial-oop-metaclass-abstraction>`_ |
| 121 | + |
| 122 | + |
| 123 | + |
0 commit comments