این ویدیو در ادامه مبحث آموزش شی گرایی در پایتون قرار دارد. در ویدیوهای قبل در مورد ایجاد کلاس و ساخت متد در پایتون صحبت شده است. همچنین در ویدیوهای بعدی در رابطه با توضیح class method و static method و وراثت در شی گرایی پایتون گفته شده است.

در شی گرایی پایتون دو نوع متغیر وجود دارد. class variable یا متغیرهای کلاسی به نوعی از متغیرها گفته میشود که مقدار آن در تمام آبجکت های ساخته شده از کلاس یکسان است. اما instance variable یا متغیرهای آبجکتی به نوعی گفته میشود که مقدار آن مختص همان آبجکت است و بقیه آبجکت ها به آن دسترسی ندارند.

 

هنگامی که انتظار داریم متغیرها در آبجکت‌ها ثابت باشند، یا زمانی که می خواهیم یک متغیر را راه اندازی کنیم، می توانیم آن متغیر را در سطح کلاس تعریف کنیم. وقتی پیش بینی می کنیم که متغیرها در موارد مختلف به طور قابل توجهی تغییر خواهند کرد ، می توانیم آنها را در سطح آبجکت تعریف کنیم.

 

این آموزش استفاده از متغیرهای کلاس و آبجکت در برنامه نویسی شی گرا در پایتون را نشان می دهد.

 


 

متغیرهای کلاسی - Class Variables

 

متغیرهای کلاس در ساختار کلاس تعریف می شوند. از آنجا که متعلق به خود کلاس است ، متغیرهای کلاس در تمام آبجکت‌های کلاس به اشتراک گذاشته می شود. بنابراین آنها به طور کلی برای هر آبجکت یک مقدار خواهند داشت مگر اینکه از متغیر کلاس برای راه اندازی اولیه یک متغیر استفاده کنید.

 

خارج از همه متدها ، متغیرهای کلاس ، طبق قرارداد ، معمولاً درست زیر کلاس و قبل از متد سازنده و سایر متدها قرار می گیرند.

 

یک متغیر کلاس به تنهایی شبیه شکل زیر است:

class Shark:
    animal_type = "fish"

 

در اینجا به متغیر animal_type مقدار "fish" اختصاص داده شده است.

 

ما می توانیم یک نمونه از کلاس Shark ایجاد کنیم (ما آن را new_shark می نامیم) و متغیر را با استفاده از نماد نقطه چاپ کنیم:

class Shark:
    animal_type = "fish"

new_shark = Shark()
print(new_shark.animal_type)

 

بیایید برنامه را اجرا کنیم:

python shark.py

# OUTPUT
fish

 

برنامه ما مقدار متغیر را برمی گرداند.

 

بیایید چند متغیر کلاس دیگر اضافه کرده و آنها را چاپ کنیم:

class Shark:
    animal_type = "fish"
    location = "ocean"
    followers = 5

new_shark = Shark()
print(new_shark.animal_type)
print(new_shark.location)
print(new_shark.followers)

 

درست مانند هر متغیر دیگری ، متغیرهای کلاس می توانند شامل هر نوع داده ای باشند که در پایتون در دسترس ما است. در این برنامه ما رشته ها و یک عدد صحیح داریم. بیایید برنامه را دوباره با دستور python shark.py اجرا کرده و خروجی را مرور کنیم:

fish
ocean
5

 

نمونه new_shark قادر است به همه متغیرهای کلاس دسترسی داشته باشد و هنگام اجرای برنامه آنها را چاپ کند.

 

متغیرهای کلاس به ما امکان می دهد تا متغیرها را بر اساس ساخت کلاس تعریف کنیم. سپس این متغیرها و مقادیر مرتبط با آنها برای هر نمونه از کلاس قابل دسترسی است.

 


 

متغیرهای آبجکت - Instance Variables

 

متغیرهای آبجکت متعلق به آبجکت‌های کلاس هستند. این بدان معناست که برای هر شیء یا نمونه از یک کلاس، آبجکت‌های نمونه متفاوت هستند.

 

برخلاف متغیرهای کلاس ، متغیرهای آبجکت در متدها تعریف می شوند.

 

در مثال کلاس Shark در زیر، name و age متغیرهای آبجکت هستند:

class Shark:
    def __init__(self, name, age):
        self.name = name
        self.age = age

 

هنگامی که یک شی Shark ایجاد می کنیم، باید این متغیرها را که به عنوان پارامترها در متد سازنده یا متدی دیگر ارسال می شوند ، تعریف کنیم.

class Shark:
    def __init__(self, name, age):
        self.name = name
        self.age = age

new_shark = Shark("Sammy", 5)

 

مانند متغیرهای کلاس ، ما می توانیم متغیرهای آبجکت را به صورت مشابه فراخوانی کنیم:

class Shark:
    def __init__(self, name, age):
        self.name = name
        self.age = age

new_shark = Shark("Sammy", 5)
print(new_shark.name)
print(new_shark.age)

 

وقتی برنامه بالا را با python shark.py اجرا می کنیم، خروجی زیر را دریافت می کنیم:

Sammy
5

 

خروجی دریافتی ما از مقادیر متغیرهایی که برای نمونه شی new_shark مقداردهی کردیم ، تشکیل شده است.

 

بیایید یک شیء دیگر از کلاس Shark به نام stevie ایجاد کنیم:

class Shark:
    def __init__(self, name, age):
        self.name = name
        self.age = age

new_shark = Shark("Sammy", 5)
print(new_shark.name)
print(new_shark.age)

stevie = Shark("Stevie", 8)
print(stevie.name)
print(stevie.age)

 

# OUTPUT
Sammy
5
Stevie
8

 

شیء stevie ، مانند شی new_shark ، پارامترهای خاص آن آبجکت از کلاس Shark را برای تعیین مقادیر به متغیرهای آبجکت ارسال می کند.

 

متغیرهای آبجکت، متعلق به آبجکت کلاس، به هر شی یا نمونه اجازه می دهد که مقادیر متفاوتی به آن متغیرها اختصاص داده شود.

 


 

کار با instance variable و class variable در کنار یکدیگر

 

متغیرهای کلاس و متغیرهای آبجکت اغلب به طور همزمان استفاده می شوند، بنابراین بیایید با استفاده از کلاس Shark که ایجاد کرده ایم به نمونه ای از آن نگاه کنیم. کامنت‌های موجود در برنامه هر مرحله از فرآیند را نشان می دهد.

 

class Shark:

    # Class variables
    animal_type = "fish"
    location = "ocean"

    # Constructor method with instance variables name and age
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # Method with instance variable followers
    def set_followers(self, followers):
        print("This user has " + str(followers) + " followers")


def main():
    # First object, set up instance variables of constructor method
    sammy = Shark("Sammy", 5)

    # Print out instance variable name
    print(sammy.name)

    # Print out class variable location
    print(sammy.location)

    # Second object
    stevie = Shark("Stevie", 8)

    # Print out instance variable name
    print(stevie.name)

    # Use set_followers method and pass followers instance variable
    stevie.set_followers(77)

    # Print out class variable animal_type
    print(stevie.animal_type)

if __name__ == "__main__":
    main()

 

وقتی برنامه را با python shark.py اجرا می کنیم ، خروجی زیر را دریافت می کنیم:

# Output

Sammy
ocean
Stevie
This user has 77 followers
fish

 

در اینجا ، ما از متغیرهای کلاس و آبجکت در دو شیء از کلاس Shark، در sammy و stevie استفاده کرده ایم.

 

در برنامه نویسی شی گرا ، متغیرهای سطح کلاس را class variable می نامند ، در حالی که متغیرهای سطح شی را instance variable می نامند.

 

 



0

Intro

10:38

رایگان

1

Variable

12:30

رایگان

2

String

19:22

رایگان

3

List

8:46

رایگان

4

While

9:6

رایگان

5

If

8:37

رایگان

6

For

6:12

رایگان

7

range

4:17

رایگان

8

break, continue, pass

9:15

رایگان

9

Function

12:32

رایگان

10

List methods

12:11

رایگان

11

Tuple

8:29

رایگان

12

Set

7:47

رایگان

13

Dictionary

9:19

رایگان

14

Module

10:40

رایگان

15

fstring

5:35

رایگان

16

format

7:34

رایگان

17

File

17:14

رایگان

18

Scope

6:25

رایگان

19

OOP

12:15

رایگان

20

Method

20:19

رایگان

21

class/instance variable

14:7

رایگان

22

class/static method

13:25

رایگان

23

Inheritance

17:6

رایگان

24

Special methods

9:50

رایگان

25

Access points

11:12

رایگان

26

property

6:54

رایگان

27

Exceptions

21:17

رایگان

28

Standard library

12:51

رایگان

29

Docstring

10:49

رایگان

30

Virtualenv

11:2

رایگان

دوره های پیشنهادی

دوره آموزش DRF جنگو
دوره آموزش DRF جنگو
تکمیل ضبط
امیرحسین بیگدلو
دوره آموزش RabbitMQ
دوره آموزش RabbitMQ
تکمیل ضبط
امیرحسین بیگدلو
دوره آموزش ردیس(redis)
دوره آموزش ردیس(redis)
تکمیل ضبط
امیرحسین بیگدلو



ارسال نظر


S.B

4 ماه قبل پاسخ به نظر

سلام خسته نباشید. ببخشید نمی شود اینطوری بگوییم که هر inestace می تواند به اجزای کلاسی که از آن ساخته شده دسترسی دارد؛ و هنگامی که نوشتید c1.wheel = 5 در حقیقت یک property یا همان attribute جدید برایش تعریف کردید که چون هنگام صدا زدن attribute در متد init ابتدا attribute های خودش را می گردد و اگر نبود کلاسی که از آن ساخته شده(کلاس پدر) را می گردد پس همانند global scope و local scope که در هنگام print کردن local scope مقدم تر بود؛ اینجا هم name که در inestance تعریف شده بود مقدم تر از name تعریف شده در کلاس بود.
پس name تعریف شده در آبجکت(inestance) c1 که مقدار آن 5 می باشد را print(چاپ) می کند.
می شود راهنمایی کنید.

ارسال نظر



امیرحسین بیگدلو

4 ماه قبل

سلام
بله، درست گفتید


S.B

4 ماه قبل

ممنون. پس میشه گفته های خودم را در جزوه ام بنویسم؟


امیرحسین بیگدلو

4 ماه قبل

بنویس

مرد خرگوشی

1 سال قبل پاسخ به نظر

واقعا دمتون گرم خدا عمرتون بده

ارسال نظر



فرناز

1 سال قبل پاسخ به نظر

خیلیی خوب توضیح میدین ممنون

ارسال نظر



moein

1 سال قبل پاسخ به نظر

دوره های شمارو دارم مجددا برای بار چندم می بینم:
ممنون از زحماتتون بی نظیرید
قسمت آخر ویدئو کد بصورت زیر تغییر کنه دیگه متد show نیاز نبود تعریف بشه:
# class variable

class Car: #blueprint
wheel = 4
def __init__(self, n , p): #built-in
self.name = n
self.price = p
print(f'{self.name} cost {self.price} and {Car.wheel} wheels' )

c1 = Car('pride',100) #object
# c2 = Car('benz',200)

Car.wheel = 5
c1 = Car('pride',100) #object

ارسال نظر



جواد

1 سال قبل پاسخ به نظر

سلام، ممنون از توضیحات عالیتون
یه سوالی دارم، اگر ما به جای اینکه class var تعریف کنیم، بیایم اونها رو توی init با مقادیر ثابت(که ثابت باشه و موقع ساخت یه شی از کلاس نشه مقداردهیش کرد)، چه ایرادی میتونه داشته باشه؟
به لحاظ پرفومنس یا موضوعات دیگه، چه مزیتی ایجاد میکنه یه class var. ؟

ارسال نظر



امیرحسین بیگدلو

1 سال قبل

سلام
کیفیت کدی که نوشتید پایین میاد. همیشه که نوشتن کد مطرح نیست، چطور نوشتن کد هم مهمه.

نیلا

1 سال قبل پاسخ به نظر

عالی بود ممنونم

ارسال نظر



حسین

1 سال قبل پاسخ به نظر

واقعا عالی توضیح دادین. خداقوت. دمتون گرم.

ارسال نظر



زهره

1 سال قبل پاسخ به نظر

بینظیر توضیح دادید. سپاسگزارم.

ارسال نظر



مهسا

2 سال قبل پاسخ به نظر

آموزشتون واقعا عالی بود.ممنون

ارسال نظر



amir2001

2 سال قبل پاسخ به نظر

اقا دمتون گرم من از 3 جا شی گرایی رو دیدم نفهمیدم (جادی رو هم دیده بودم ) اما اینجا رو دیدم فهمیدم .
دمممممممممممممممممممممممممممممممممت گررررررررررررررم

ارسال نظر



مینا

2 سال قبل پاسخ به نظر

عالی خسته نباشید
توضیحات بسیار کامل و گیرا بود

ارسال نظر



مهدی

3 سال قبل پاسخ به نظر

خیلی ممنون از شما

ارسال نظر



MORTEZA

3 سال قبل پاسخ به نظر

خیلی ممنون کامل و گیرا بود مخصوصا class variables

ارسال نظر



مونگارد