Last active
October 29, 2021 07:08
-
-
Save iamvee/f67cc711782261f4309dad0156fa46d4 to your computer and use it in GitHub Desktop.
repr and str and repr_html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"id": "b42e3e47", | |
"metadata": {}, | |
"source": [ | |
"خب! توی پایتون برای هر کلاسی ما یه سری متد خاص داریم که از قبل برای یه کار مشخصی تعریف شده. مثلا \n", | |
"\n", | |
"`__eq__`\n", | |
"\n", | |
"برای این منظور به کار میره که بیاییم مقایسه کنیم دو تا اینستنس از یک کلاس با هم برابر هستند یا خیر. این جوری مثلا:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "1374e075", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"True\n", | |
"False\n" | |
] | |
} | |
], | |
"source": [ | |
"class Point:\n", | |
" def __init__(self, x, y):\n", | |
" self.x = x\n", | |
" self.y = y\n", | |
" \n", | |
" def __eq__(self, other):\n", | |
" return self.x == other.x and self.y == other.y\n", | |
" \n", | |
"\n", | |
"p1 = Point(1, 2)\n", | |
"p2 = Point(1, 2)\n", | |
"p3 = Point(1, 4)\n", | |
"\n", | |
"print(p1 == p2)\n", | |
"print(p1 == p3)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "d94db8c3", | |
"metadata": {}, | |
"source": [ | |
"حالا یه مسالهای هست که ما دو تا مفهوم کاملا متفاوت داریم برای نمایش آبجکت. اکثرا از پرینت برای نمایش آبجکت استفاده میکنیم و خب مشکل خاصی هم نداره اغلب مواقع ولی باید توجه کنیم که پرینت یک رشته رو توی استاندارد آوتپوت چاپ میکنه. حالا این رشته از کجا میاد؟ از فراخوانی متدی به اسم \n", | |
"\n", | |
"`__str__`" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"id": "bb8394ad", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"<__main__.Point object at 0x7fd23b1d3460>\n", | |
"<__main__.Point object at 0x7fd23b1d3460>\n" | |
] | |
} | |
], | |
"source": [ | |
"print(p1)\n", | |
"print(p1.__str__())" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "d09f0d6e", | |
"metadata": {}, | |
"source": [ | |
"ولی یه چیز دیگه هم داریم. وقتی شما مستقیما توی کامندلاین اسم یه متغیر رو بنویسید، اون آبجکتی که توی اون آدرس ذخیره شده، «نمایش» داده میشه. ولی «نمایش» با پرینت فرق داره. یعنی شما اگه توی اجرای اون برنامه یه جایی وسط کدت فقط اسم متغیر رو نوشته باشی، دیگه مثل کامند لاین عمل نمیکنه و خروجیای توی استاندارد آوتپوت نخواهیم داشت. پس برای همینه که اگه توی اسکریپت بخواهیم یه چیزی رو چک کنیم، از لاگ یا پرینت استفاده میکنیم و صرفا نوشتن اسم متغیر توی یک خط هیچ خروجیای به همراه نخواهد داشت. \n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"id": "95a6499f", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"1" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"num = 1\n", | |
"\n", | |
"# print \n", | |
"print(num)\n", | |
"\n", | |
"# represent\n", | |
"num" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "e238647e", | |
"metadata": {}, | |
"source": [ | |
"همینو ولی با ترتیب عکس بنویسیم فقط قسمت پرینتش رو خواهیم دید:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"id": "e6c4c2a1", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1\n" | |
] | |
} | |
], | |
"source": [ | |
"num = 1\n", | |
"\n", | |
"# represent\n", | |
"num\n", | |
"\n", | |
"# print \n", | |
"print(num)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "e980fb6d", | |
"metadata": {}, | |
"source": [ | |
"یا مثلا اگه چند تا نمایش توی چند خط متوالی داشته باشیم، فقط آخریه رو میتونیم ببینیم" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"id": "6db9e148", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"4" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"1\n", | |
"2\n", | |
"3\n", | |
"4" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "04d32438", | |
"metadata": {}, | |
"source": [ | |
"حالا شما میتونید برای هر کلاسی که تعریف میکنید، هر دو تا متد رو به صورت شخصی سازی شده بنویسید (چیزی که به صورت پیش فرض میبینید رو در واقع میشه تغییر داد) \n", | |
"\n", | |
"به صورت پیش فرض نمایش و پرینت هر آبجک شامل اسم کلاس سازنده و آدرس آیدی یا جاییه که اون اینستنس ذخیره شده. \n", | |
"\n", | |
"شاید بپرسید چه فرقی دارن این دو تا. مثلا بیایید به یه استرینگ نگاه بندازیم و ببینیم اونجا فرق ریپرزنت و استرینگ چیه " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"id": "de9217ab", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'hello'" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"text = \"hello\"\n", | |
"\n", | |
"text.__str__()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"id": "a53ac252", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"\"'hello'\"" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"text = \"hello\"\n", | |
"\n", | |
"text.__repr__()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "d7aff69c", | |
"metadata": {}, | |
"source": [ | |
"چرا ریپرزنت دو تا کوتیشن اضافه داره؟ چون وقتی ما همین جوری خالی خالی مینویسیم اسم متغیر رو، چیزی که نشون میده پرینت خروجی متد ریپرزنت هست یعنی این دو تا با هم معادل هستند (فقط در زمانی که توی کامند لاین/کنسول خود پایتون بنویسمش)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"id": "ac45b5f4", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'hello'" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"text" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"id": "35a1ed0d", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"'hello'\n" | |
] | |
} | |
], | |
"source": [ | |
"print(text.__repr__())" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "f88311e0", | |
"metadata": {}, | |
"source": [ | |
"حالا برای آبجکت خودمون اینا رو اضافه کنیم:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"id": "4b0e8739", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class Point:\n", | |
" def __init__(self, x, y):\n", | |
" self.x = x\n", | |
" self.y = y\n", | |
" \n", | |
" def __eq__(self, other):\n", | |
" return self.x == other.x and self.y == other.y\n", | |
" \n", | |
" def __repr__(self):\n", | |
" return f\"POINT({self.x}, {self.y})\"\n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"id": "509b9150", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"POINT(2, 3)" | |
] | |
}, | |
"execution_count": 14, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"p4 = Point(2, 3)\n", | |
"\n", | |
"p4" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "c119f7d0", | |
"metadata": {}, | |
"source": [ | |
"ما متد استرینگ رو هنوز تعریف نکردیم. ولی اینو باید بدونیم اگه متد استرینگ رو نداشته باشیم، پایتون به جاش میره از خروجی ریپرزنت استفاده میکنه" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"id": "b4d33051", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'POINT(2, 3)'" | |
] | |
}, | |
"execution_count": 15, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"p4.__str__()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "b7016eb5", | |
"metadata": {}, | |
"source": [ | |
"حالا اگه بخواهیم میتونیم اون رو هم جدا تعریف کنیم:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"id": "87d65739", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class Point:\n", | |
" def __init__(self, x, y):\n", | |
" self.x = x\n", | |
" self.y = y\n", | |
" \n", | |
" def __eq__(self, other):\n", | |
" return self.x == other.x and self.y == other.y\n", | |
" \n", | |
" def __repr__(self):\n", | |
" return f\"POINT({self.x}, {self.y})\"\n", | |
" \n", | |
" def __str__(self):\n", | |
" return f\"point({self.x}, {self.y})\"\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"id": "cf93dfbf", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"POINT(5, 6)" | |
] | |
}, | |
"execution_count": 19, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"p5 = Point(5, 6)\n", | |
"\n", | |
"p5" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"id": "0943bea5", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'point(5, 6)'" | |
] | |
}, | |
"execution_count": 21, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"p5.__str__()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"id": "9f805b16", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"point(5, 6)\n" | |
] | |
} | |
], | |
"source": [ | |
"p5 = Point(5, 6)\n", | |
"\n", | |
"print(p5)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "e92fea16", | |
"metadata": {}, | |
"source": [ | |
"اوکی. همه اینا رو گفتم تا برسم به ژوپیتر نوت بوک. توی نوک بوک ما یه متد خاص جدید داریم که اگه تعریف بشه، نسبت به \n", | |
"\n", | |
"`__repr__`\n", | |
"\n", | |
"اولویتش بیشتره. اسم این متده \n", | |
"\n", | |
"`_repr_html_`\n", | |
"\n", | |
"هست. به چه دردی میخوره؟ شما با این متد میتونید از تگ های اچ تی ام ال هم استفاده کنید. برای همینه که مثلا آبجکتهای پانداس این قدر خوشگل و تر تمیزه و فقط تکست خالی نیست و استایل و کلی چرت و پرت دیگه هم داره. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"id": "c6afab1e", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"\n", | |
" <b><i>Point</i></b>\n", | |
" --> <i>(6, 8)</i>\n", | |
" " | |
], | |
"text/plain": [ | |
"<__main__.Point at 0x7fd23b1a4fd0>" | |
] | |
}, | |
"execution_count": 25, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"class Point:\n", | |
" def __init__(self, x, y):\n", | |
" self.x = x\n", | |
" self.y = y\n", | |
" \n", | |
" def __eq__(self, other):\n", | |
" return self.x == other.x and self.y == other.y\n", | |
" \n", | |
" def _repr_html_(self):\n", | |
" return f\"\"\"\n", | |
" <b><i>Point</i></b>\n", | |
" --> <i>({self.x}, {self.y})</i>\n", | |
" \"\"\"\n", | |
"\n", | |
"p6 = Point(6, 8)\n", | |
"\n", | |
"p6" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "74c668e8", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3.9.5 64-bit ('venv': venv)", | |
"language": "python", | |
"name": "python395jvsc74a57bd033ca8a6b7d5ef71d9c5f58bacb2b5551b9b8108d40f9f83625b8c3a3a16274a3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.9.6" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment