شاید تا کنون جملهی «در پایتون همه چیز شی است» را شنیده باشید. ولی این دقیقا یعنی چه؟ و چرا دانستنش سودمند است؟
برای فهمیدن این جمله نخست باید بدانیم «شی چیست؟».
توجه. چون اعتقاد به بیانیدن آسان، دقیق، و کوتاه دارم، واژگان زیادی ساختهام. با کمی دقت ریشه و معنی بیشترشان قابل شناسایی است. بهرحال، بیشتر واژگانی که ساختهام را در ویکیواژه تعریفتهام (تعریف کردهام).
امیدوارم خوشایندت باشد.
در پایتون واژهی «شی» به یه مجموعه از خصیصههای (attribute) (شامل ویژگیها و متدها) بهم بستشته (بستهشده) میاشارد (اشاره میکند) که در حافظه مستقیم (RAM) قرار دارد؛ به زبان سادهتر، هر شی دارای نشانی حافظه و خصیصههایی است.
a = 'Amookhsin' type(a), hex(id(a)) # خروجی (str, '0x7f1fb0458df0')
حالا آمادهی فهمیدن مفهوم جملهی «همه چیز شی است» شدیم.
پس جمله «در پایتون همه چیز شی است» به این معنی است که در پایتون همه چیز، شامل کلاسها، نمونهها، ویژگیها، متدها، تابعها، متغیرها، عملگرها (مانند، +
، is
، و ...)، و کلی چیز دیگر بعنوان شی انگارشد (انگاشته میشوند). به زبان خیلی ساده، یعنی کدهای نویسشته (نوشتهشده) در یه پودمان (فایل) پایتون را میتوان با مفهوم شی وصفید (وصف کرد)؛ بعبارتی میتوان بر روی خطهای برنامه پیشرفت و گفت: با این بخش/کد یه شی ایجادشد (ایجاد شود)، با این یکی یه شی فراخوانپذیر فراخوانشد (فراخوانده شود).
برای نمونه، با خطهای یک تا سه مثال زیر یه شی از یه نوع خاص (type) درحافظه مستفیم (RAM) ایجادشد (ایجاد شود)، که دارای خصیصههایی (ویژگی، متد) است، و به یه ارجاعال (متغیر) بنام MyClass
انتسابشد (انتسابیده میشود). سپس با خط چهارم یه نمونه از شی MyClass
ایجادشد (ایجادشود) و به ارجاعال my_class
انتسابشد (انتسابیده میشود). به خروجی بدقت (دقت کن).
class MyClass: def method(self): pass my_class = MyClass() type(MyClass), hex(id(MyClass)), type(my_class), hex(id(my_class)) # خروجی (type, '0x5634543597e0', __main__.MyClass, '0x7f1fb0460700')
خب، این درمورد کلاسها، متدها، و تابعها فهمپذیر است؛ ولی در مورد عملگرها کمی گنگ است. چگونه میتوان یه عملگر مانند ==
را با مفهوم شی وصفید؟
کلید فهمیدن این، دانستن اینه که مفسر پایتون هنگام برخورد با عبارتهایی مانند a == b
درواقع شی فراخوانپذیر __eq__
(که یه متد شی a
است) را میاجراید. به مثال زیر بدقت.
a = 1 b = 2 a == b, a.__eq__(b) # خروجی (False, False)
توجه. معنی واژهی شی در زبان پایتون بسیار گسترده است؛ بطوریکه به کلاس (شی کلاس)، نمونههای یه کلاس، تابعها، متدها و ... میاشارد (اشاره میکند).
ولی دانستن اینها چه سودی دارد؟
فهمیدن ارزش «در پایتون همه چیز شی است» وابسته به دانستن اینه که «در پایتون شی را میتوان به متغیر انتسابید». پس در پایتون هر کلاس، تابع، و غیره را میتوان به یه متغیر انتسابید و حتی بعنوان آرگومان به یه تابع یا یه شی فراخوانپذیر فرستاد.
def say_hello(name): return f'Hello {name}' greet = say_hello greet is say_hello, greet('Amookhsin') # خروجی (True, 'Hello Amookhsin')
در پایتون برای ارجاعیدن به یه شی فراخوانپذیر (مانند تابع) از شناسالش (نامش، identifier) استفایشد (استفاده میشود)؛ و اگر پس از شناسالش علامتهای ()
آورشد (آورده شود) متد __call__
آن شی فراخوانشد (فراخوانده میشود).
def func(): print('func executed...') func() # خروجی func executed...
پس، فهمیدیم در پایتون همه چیز بعنوان یه شی انگارشد (انگاشته میشود) و میتوان آنها را به یه متغیر انتسابید و حتی بعنوان آرگومان به شیهای فراخوانپذیر فرستاد.