Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added _static/l19-python-metaclass-type.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 8 additions & 1 deletion donate-report.rst
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

مبالغ مهم نیستند، از اقدام و پیام تشویق شما دوستان بسیار سپاسگذارم. (*اطلاعات این صفحه به صورت آنی بروز نمی‌شود!*)

**از ابتدا (1394): 1,921,222 تومان** [آخرین بروزرسانی:‌ 15-12-1399]
**از ابتدا (1394): 2,121,222 تومان** [آخرین بروزرسانی:‌ 27-12-1399]

----

Expand All @@ -27,6 +27,13 @@



.. raw:: html

<p id="5076eb" >51: <strong style="color:#5C6BC0">200,000 تومان</strong> در زمان 13:53 24-12-1399<br><q>بسیار کتاب خوبی هست لطفا زودتر تمومش کنید</q></p>

----


.. raw:: html

<p id="cdb629" >50: <strong style="color:#5C6BC0">50,000 تومان</strong> در زمان 16:42 13-12-1399<br><q>ممنون که همیشه در حال بروز رسانی هستید، منم سعی میکنم تا بروز میکنید دونیت کنم!</q></p>
Expand Down
18 changes: 17 additions & 1 deletion index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,30 @@
lessons/l16
lessons/l17
lessons/l18
lessons/l19
log
donate-report
python-interactive

|

.. note::
کتاب در حال تکمیل است!.
**این کتاب در حال توسعه می‌باشد...(سطح متوسط)**

**شروع:** فروردین ۱۳۹۴ **و** **آخرین بروزرسانی:** اسفند ۱۳۹۹ [`گزارش توسعه <log.html>`__]

.. note::

**برای محتوای این کتاب، چهار سطح آموزشی در نظر گرفته شده است:**

* **سطح پایه:** دروس ۱ تا ۵، معرفی پایتون و کسب مهارت لازم برای شروع کار با پایتون

* **سطح مقدماتی:** دروس ۶ تا ۱۱، آشنایی با اجزا و ساختارهای ابتدایی در پایتون

* **سطح متوسط:** دروس ۱۲ تا ؟، آشنایی با مفاهیم و ساختارهای پیچیده و ضروری در پایتون

* **سطح پیشرفته:** دروس ؟ تا ؟، آشنایی با مفاهیم و ماژول‌های حرفه‌ای در پایتون




74 changes: 73 additions & 1 deletion lessons/l17.rst
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@
print('kwargs: ', kwargs)

# create new object
obj = super().__new__(cls)
obj = super().__new__(cls, *args, **kwargs)

# return object
return obj
Expand Down Expand Up @@ -230,6 +230,78 @@
* ارسال آرگومان در زمان نمونه‌سازی شی یا همان پیاده‌سازی متد ``__init__`` به برنامه‌نویس این اطمینان را می‌دهد که شی جدید در یک وضعیت درست تنظیم شده است.

* آرگومان‌های متناظر با پارامتر‌های متد ``__init__`` (به جز ``self`` که توسط مفسر پایتون مقداردهی می‌گردد) می‌بایست در زمان نمونه‌سازی و فراخوانی کلاس ارسال گردد.


اشیا با قابلیت فراخوانی (Callable Objects)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

پیش‌تر دیدیم که می‌توان توابع را فراخوانی نمود (درس دروازدهم)، با این کار بدنه تابع اجرا و خروجی متناسب دریافت می‌گردید. در این درس نیز مشاهده کردیم کلاس‌ها نیز در پایتون توانایی فراخوانی دارند که با فراخوانی کلاس، یک شی از آن ایجاد می‌گردد. با استفاده از تابع ``callable`` در پایتون می‌توان تشخیص داد که آیا یک شی قابلیت فراخوانی دارد یا خیر [`اسناد پایتون <https://docs.python.org/3/library/functions.html#callable>`__]، این تابع در صورتی که شی دریافتی قابلیت فراخوانی (callable) داشته باشد مقدار ``True`` و در غیر این صورت ``False`` برمی‌گرداند::

>>> def function():
... pass
...
>>> callable(function)
True

>>> class SampleClass:
... pass
...
>>> callable(SampleClass)
True

>>> obj = SampleClass()
>>> callable(obj)
False

>>> obj()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'SampleClass' object is not callable


همانطور که از نمونه کد بالا مشخص است، اشیایی که از کلاس‌های خودمان ایجاد می‌کنیم، بر خلاف خود کلاس قابلیت فراخوانی ندارند. در زبان پایتون می‌توانیم این قابلیت را به اشیا کلاس‌های خود اضافه نماییم.

همانطور که اشاره شد، کلاس در پایتون چندین متد خاص همانند ``__new__`` و ``__init__`` دارد که به تدریج به آنها آشنا خواهیم شد. یکی دیگر از این متدها ``__call__`` می‌باشد [`اسناد پایتون <https://docs.python.org/3/reference/datamodel.html#object.__call__>`__]. این متد نیز همانند متد ``__init__`` از نوع Instance Method (*بخش بعدی شرح داده شده است*) می‌باشد که با پیاده‌سازی آن در کلاس، اشیای آن کلاس قابلیت فراخوانی پیدا خواهند کرد:



.. code-block:: python
:linenos:

class Sample:

def __init__(self, x=0, y=0):
print('------------------- Called __init__()')
self.x = x
self.y = y

def __call__(self, x, y):
print('------------------- Called __call__()')
self.x = x
self.y = y


obj = Sample()
print('object is callable:', callable(obj))
print('x =', obj.x)

obj(5, 6)
print('x =', obj.x)

::

------------------- Called __init__()
object is callable: True
x = 0
------------------- Called __call__()
x = 5


سطر ۱۸ نمایش فراخوانی یک شی از کلاس Sample می‌باشد - درست به مانند یک تابع!

با فراخوانی یکی شی، به صورت خودکار متد ``__call__`` فراخوانی و آرگومان‌های نظیر ارسال می‌گردند.

از کاربردهای پیاده‌سازی متد ``__call__`` و افزودن قابلیت فراخوانی به یک شی می‌توان به ایجاد کلاس به عنوان دکوراتور (decorator) اشاره کرد (*دروس آتی شرح داده خواهد شد*) و همچنین کاربردهایی که نیاز می‌شود شی در زمان اجرا initialize یا مقداردهی دوباره داشته باشد، چرا که متد ``__init__`` تنها یکبار در زمان نمونه‌سازی فراخوانی می‌گردد.



Expand Down
Loading