Skip to content

Commit 996613c

Browse files
author
Saeid
committed
l19: start
1 parent bd01efb commit 996613c

4 files changed

Lines changed: 125 additions & 1 deletion

File tree

_static/l19-python-metaclass.png

19.3 KB
Loading

index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
lessons/l16
4545
lessons/l17
4646
lessons/l18
47+
lessons/l19
4748
log
4849
donate-report
4950
python-interactive

lessons/l17.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@
175175
print('kwargs: ', kwargs)
176176
177177
# create new object
178-
obj = super().__new__(cls)
178+
obj = super().__new__(cls, *args, **kwargs)
179179
180180
# return object
181181
return obj

lessons/l19.rst

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
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

Comments
 (0)