انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: Nelliel در 19 خرداد 1395، 01:05 ب‌ظ

عنوان: سوالاتی درباره‌ی کلاس‌ها در پایتون
ارسال شده توسط: Nelliel در 19 خرداد 1395، 01:05 ب‌ظ
سلام

من شروع کردم به مطالعه راجعه به کلاس‌ها (Classes) در پایتون و چندتا سوال برام پیش اومد, اول از همه می‌خوام فرق Attribute و Method را به زبان روان فارسی برام توضیح بدید, فرق این دوتا چیه؟

این کد منه:



#!/usr/bin/python3

class Test(object):
   
    fun = 'life'
   
    def damn(self):
        print("I love it")
   
    def __init__(self, hello, allow):
        self.allow = allow
        self.hello = hello
   


x = Test(hello = "fun", allow = "test")
print(x.allow)
print(x.hello)
x.fun
print(x.damn())




این خروجی منه:


runfile('/home/hossein/Prog/test.py', wdir='/home/hossein/Prog')
test
fun
I love it
None


می‌خوام بدونم اون None توی خروجی چیکار داره؟ چطوری میشه اون None نباشه؟ نقش __init__ چیه؟ می‌دونم از پیش تعیین شده هست اما اگر نباشه که ارور نمی‌ده پس چرا اون را می‌ذاریم؟ اگر نباشه میشه یه چیزی مثل damn توی همون کد؟!!


توی همون کدی که دادم من یه Test(object) را گذاشتم, وقتی تایپ کلمه‌‌ی Object تموم میشه رنگی میشه, چرا؟ دقیقا نقش Object چیه؟ و کلا وقتی می‌خوای کلاس تعریف کنی دیگه چه چیز‌هایی به جز Object می‌تونی بذاری؟ اگه خالی بذاری چی؟
عنوان: پاسخ : سوالاتی درباره‌ی کلاس‌ها در پایتون
ارسال شده توسط: hamidrezakp در 19 خرداد 1395، 01:56 ب‌ظ
خیلی سوال داری که :D
Attribiute یعنی خاصیت که همون متغیر های داخل کلاس رو میگن. Method همون تابع های داخل کلاس هستن.

None واسه اینه که تابع domn مقدار برگشتی نداره .

__init__ برای اینه که موقع ساخت یک شی از روی این کلاس یکسری متغیر یا یکسری کار ها رو بگیره و انجام بده .مثلا تو اینجا hello و allow رو موقع تعریف شی میگیری .
Objectبرای این استفاده شده که کلاس از اون خاصیت ها و متد ها رو به ارث ببره . (مبحث وراثت رو مطالعه کن)



عنوان: پاسخ : سوالاتی درباره‌ی کلاس‌ها در پایتون
ارسال شده توسط: Nelliel در 20 خرداد 1395، 10:22 ق‌ظ
من که نفهمیدم چی گفتی ;D ولی حالا لطفا Class_suite را برام توضیح بده, من اینو خوندم چیزی متوجه نشدم:

نقل‌قول
The class_suite consists of all the component statements defining class members, data attributes and functions.

می‌شه لطفا توی یه مثال با کد بگی کارش چیه؟
عنوان: پاسخ : سوالاتی درباره‌ی کلاس‌ها در پایتون
ارسال شده توسط: hamidrezakp در 20 خرداد 1395، 07:32 ب‌ظ
من که نفهمیدم چی گفتی ;D ولی حالا لطفا Class_suite را برام توضیح بده, من اینو خوندم چیزی متوجه نشدم:

نقل‌قول
The class_suite consists of all the component statements defining class members, data attributes and functions.

می‌شه لطفا توی یه مثال با کد بگی کارش چیه؟

class SubClassName (ParentClass1[, ParentClass2, ...]):
   'Optional class documentation string'
   class_suite

class_suite یعنی اجزای کلاس که شامل خاصیت ها متد هاو .. است .  :)
عنوان: پاسخ : سوالاتی درباره‌ی کلاس‌ها در پایتون
ارسال شده توسط: Nelliel در 20 خرداد 1395، 11:04 ب‌ظ
حمیدرضا یه سری توضیحات خوبی داد, من "حل شد" را نمی‌زنم اگر کسی نظر دیگه‌داره می‌تونه بگه :)
عنوان: پاسخ : سوالاتی درباره‌ی کلاس‌ها در پایتون
ارسال شده توسط: 藤沼 در 21 خرداد 1395، 12:55 ب‌ظ
یکی از پایه‌ها برای «یادگیری» یک زبان اینه که باید کتابی مناسب درباره‌اش خوند مگر تلاش فقط برای تجربه باشه وگرنه دانش فرد در اون زبان در اندازه‌ای که باید پیشرفت نمی‌کنه. بیشتر مرجع‌هایی که بروی اینترنت هستن به مسئله‌ها سطحی می‌پردازن و سریع می‌گذرن بنابراین اینجا باز هم به ضعف در یادگیری می‌انجامه. چندتا کتاب خوب برای یادگیری زبان برنامه‌نویسی پایتون:

(خوبه ولی دقیق نیست) Programming in Python 3: A Complete Introduction to the Python Language
(ضعف‌های قبلی رو کاملاً برطرف می‌کنه) Learning Python, 2nd Edition

نکته: برای دریافت اینکه آیا کتابی که می‌خونی خوبه یا نه برای مثال؛ کتاب «یادگیری پایتون، ویراست دوم» می‌تونی از لینک زیر بررسی اون رو ببینی (هروقت خواستی کتابی رو بخونی اول درون سایت زیر عنوان اون رو جستجو کن اگر به‌غیراز Highly Recommended و Recommended بود؛ برو سراغ یکی دیگه):
http://accu.org/index.php?module=bookreviews&func=search&rid=476
عنوان: پاسخ : سوالاتی درباره‌ی کلاس‌ها در پایتون
ارسال شده توسط: Nelliel در 21 خرداد 1395، 06:14 ب‌ظ
ممنون ازتون, راستش کتاب زیاد دارم لی سوالاتم فقط در همین مبحث بود :) هم از روی ویدئو می‌رم هم مقالات سطحی وب و هم بعضی وقت‌ها تستی اسکریپت می‌نویسم و کتاب هم کنارش می‌خونم که کاملا مسلط شم :)
عنوان: پاسخ : سوالاتی درباره‌ی کلاس‌ها در پایتون
ارسال شده توسط: saeiddrv در 02 تیر 1395، 02:33 ب‌ظ
سلام
خوب ببینید هر کلاس شامل مجموعه‌ای از صفت‌ها و کارهاست.. یکم توضیحات بیشتر رو من اینجا نوشتم شاید به دردت بخورن :
 http://python.coderz.ir/lessons/l05.html (http://python.coderz.ir/lessons/l05.html)

تو پایتون ما دو نوع اتریبیوت (صفت) داریم: اتریبیوت‌هایی که در سطح کلاس (Class Attribute) و اتریبیوت‌هایی که در سطح شی‌های کلاس (Instance Attribute) تعریف می‌شن.
اتریبیوت‌های کلاس توسط تمام نمونه یا اشیایی که از اون کلاس ساخته میشن، در دسترسه.. یعنی اگر مقدار اون‌ها تغییر داده بشه، برای تمام نمونه‌ها یا اشیای کلاس هم تغییر پیدا می‌کنه، این نوع اتریبیوت توسط نام کلاس و اشیا کلاس در دسترس قرار می‌گیره
ولی اتریبیوت‌های شی این طور نیستند و فقط در حوزه هر شی تعریف می‌شن، فقط با استفاده از اشیا در دسترس هستند و تغییر اون‌ها توسط شی هم فقط موجب تغییر مقدار اون اتریبیوت برای همون شی می‌شه...

یه مثال ساده:

>>> class Test:
...     class_variable = 1
...     def __init__(self, arg_1, arg_2):
...         self.instance_variable_1 = arg_1
...         self.instance_variable_2 = arg_2

همون‌طور که مشخصه الان کلاس Test یه اتریبیوت کلاس و دو اتریبیوت شی داره.
دو نمونه یا شی از کلاس می‌ سازیم:

>>> t1 = Test('a1', 'b1')
>>> t2 = Test('a2', 'b2')

متد __init__ نقش سازنده (constructor) رو در کلاس های پایتون داره و به صورت خودکار بلافاصله بعد از ایجاد شی فراخوانی می‌شه. آرگومان اول این متد هم همیشه به شی ایجاد شده اشاره داره... که همیشه باید باشه. به این ترتیب با ایجاد هر شی این متد میاد و برای اون شی دو تا اتریبیوت هم ایجاد می‌کنه که مقدار اون‌ها در لحظه ایجاد نمونه یا شی باید تعیین بشن.

کار با اتریبیوت کلاس:

>>> Test.class_variable
1

>>> t1.class_variable
1
>>> t2.class_variable
1

>>> Test.class_variable = 3

>>> t1.class_variable
3
>>> t2.class_variable
3

نکته‌ای که هست اینه که هر وقت خواستیم مقدار اتریبیوت کلاس رو تغییر بدیم، باید همیشه از نام خود کلاس استفاده کنیم. در غیر این صورت یعنی تغییر مقدار اتریبیوت کلاس با استفاده از شی،‌ موجب ایجاد یک اتریبیوت شی جدید برای اون شی میشه:
>>> t1.class_variable = 5

>>> Test.class_variable
3
>>> t1.class_variable
5
>>> t2.class_variable
3

کار با اتریبیوت شی هم فکر نکنم نیاز به مثالی داشته باشه... حالا اگه سوالی داشتی.. که خوب هستم در خدمتت...

در مورد کلاس خودت:
قسمت پایین کدت رو اینطور اصلاح می‌کنم:
print(x.allow)
print(x.hello)
print(Test.fun)
x.damn()

اون None هم به خاطر این هستش که سطر آخر کد شما print تو print شده!.. متد damn خودش یک print داره که خروجی رو به خروجی استاندارد پایتون که اینجا کامند لاین میشه می‌فرسته .... و نه به شکل پارامتر به تابع print دوم... و در واقع همونطور که یکی از دوستان هم گفت ... تابع print در سطر آخر اصلا چیزی رو دریافت نمی‌کنه تا چاپ کنه... و None هم حاصل چاپ هیچی هستش.

عنوان: پاسخ : سوالاتی درباره‌ی کلاس‌ها در پایتون
ارسال شده توسط: saeiddrv در 02 تیر 1395، 02:52 ب‌ظ
اون object ...
کاری که صورت گرفته،‌ارث بری هستش. شما می‌تونید موقع تعریف کلاس؛ اسم کلاس‌هایی که می‌خواین ازشون ارث بری داشته باشین رو داخل پرانتز جلوی اسم کلاس بنویسید.

در پایتون سری 3x نیازی به ذکر کلاس object نیسست.
در طراحی جدید کلاس‌های پایتون ... تمام کلاس‌ها باید از کلاس object ارث‌بری داشته باشن.