:: پشتیبانی فنی ADSL به پارسی ::

::: ADSL - ویندوز - نرم افزار - سخت افزار - موبایل - لینوکس - آفیس - شبکه - برنامه نویسی :::

:: پشتیبانی فنی ADSL به پارسی ::

::: ADSL - ویندوز - نرم افزار - سخت افزار - موبایل - لینوکس - آفیس - شبکه - برنامه نویسی :::

:: پشتیبانی فنی ADSL به پارسی ::

تقدیم به تمام پشتیبانان ADSL که به رنج در تلاشند

*** تاسیس به سال 1389 در بلاگفا ***

بایگانی
پیوندهای روزانه
  • ۰
  • ۰

کلاس ها - وراثت - چند ریختی - اداره کردن استثنا 

 

کلاس هایی هستند که در پایتون وجود دارند نظیر int و str و ... که قبلاً نوشته شده اند کلاس هایی هم در کتابخانه هایی نظیر Numpy نوشته شده اند این تعداد کلاس ها کافی و مناسب نیست و برنامه نویسان باید بتوانند کلاس های مورد نیاز خود را داشته باشند 

شی گرایی به معنای مدل سازی اشیای دنیای واقعی در زبان برنامه نویسی است شی گرایی یکی از چندین تکنیکی است که برای مدل سازی سیستم های پیچیده مورد استفاده قرار می گیرد یعنی می توان عملیات پیچیده را به صورت مجموعه ای از اشیا تعریف کرد در دنیای خارج از کامپیوتر شی یکسری عناصر قابل لمس است که می توان آن را دستکاری کرد مثل اجزای اتومبیل - هدف از برنامه نویسی حل مسائل دنیای واقعی است - زبان هایی مثل C و پاسکال زبان هایی ساختار یافته بودند که امکان شی گرایی نداشتند هر شی شامل داده ( متد ها ) - رفتار است ( Data - Behaviors ) برای مثال یک انسان که می تواند دانش آموز باشد و یک شی در دنیای واقعی است و اطلاعاتی از قبیل نام و نام خانوادگی و شماره دانش آموزی و ... داده های آن است می توان رفتارهای دیگری هم بر روی او اشاره کرد نظیر قبولی یا تجدید در درس - نمره گرفتن - محاسبه معدل و ... در این تفکر شی گرایی سه اصطلاح مهم داریم :

- تحلیل شی گرایی ( OOA ) : در این مرحله مشخص کنیم چه کارهایی باید صورت بگیرد خروجی آن مجموعه ای از نیازمندی هاست 

- طراحی شی گرایی ( OOD ) : فرایندی تبدیل نیازمندی های مرحله قبل به مشخصات پیاده سازی است طراح اشیا را نام گذاری کرده - تعامل بین آنها را مشخص می کند و مشخص کننده این است که کارها به چ صورتی انجام شود هر تشخیصی به کلاس تبدیل می شود 

- برنامه نویسی شی گرا (oop ) : فرآیند تبدیل طراحی انجام شده به برنامه ای است که نیازهای مشتریان را برآورده کند 

 

4 اصل شی گرایی :

1- محصورسازی : که Encapsulation شدن هست یک متد و داده در کلاسی که فقط در همان کلاس کارایی دارد این ویژگی پنهان سازی اطلاعات هم گفته می شود 

2- انتزاع : که Abstraction داده های موجود در یک شی نسبت به دنیای خارج از آن مخفی است انتزاع فقط ویژگی های ضروری یک شی را در اختیار دنیای خارج از خودش قرار می دهد و اطلاعات حساس را مخفی نگه می دارد مانند دستگاه خودپرداز که مراحل پرداخت وجه به مشتری از دید او مخفی است 

3- وراثت : که Inheritance کلاسی می تواند ویژگی های کلاس دیگری را بدست آورد 

4- چند ریختی : که Polymorphism یک حالت مثلاً یک متد در وضعیت های مختلف رفتارهای متفاوتی از خودش نشان دهد مثلاً + جمع دو مقدار عددی که بین دو مقدار رشته ای متفاوت است 

 

مزایای برنامه نویسی شی گرا :

هزینه های کمتر و بهره وری بیشتر از برنامه ویژگی شی گرایی بودن است از جمله :

 

- ویژگی وراثت : از کد موجود چندین بار استفاده کرد 

- توسعه ماژول : در هزینه و زمان صرفه جویی کنیم

- انتزاع : امکان پنهان سازی اطلاعات را می دهد و برنامه ها در این حالت امنیت خوبی دارند 

- عدم تداخل اشیا : هر شی دارای داده های خاص خود است و تغغیرات در آن تاثیری در اشیا دیگر ندارد 

- تقسیم و حل : مسائل بزرگ را کوچکتر می کند و به چند ریز مسئله که دیگر برنامه نویسان بتوانند در توسعه نرم افزاری و اشکال یابی بهتر عمل کنند 

- مدل سازی دنیای واقعی : مشخص است 

- مقیاس پذیری : از سیستم کوچک به سیستم بزرگ تبدیل شود 

 

کلاس و شی :

 

کلاس باعث می شود ویژگی های هر شی مثلاً دانشجو و دانشگاه که گونه های مختلفی دارند از هم مجزا شوند و ایجاد اشیا در کلاس را نمونه سازی می گویند ( Instance ) در پایتون - داده های یک کلاس را فیلد (Field)- یا خصیصه ( Attribute ) همان دیتا تایپ ها - اعمال کلاس را متد (Method) - ( که همان رفتار است ) می گویند 

 

ایجاد کلاس و اشیا در پایتون :

 

برای ایجاد کلاس در پایتون :

 

class className :  =====>     راس کلاس
    attribute_definition }   بدنه کلاس
    method_definition    }

 

Class واژه کلیدی است و در کنار آن یک نام به دلخواه نوشته می شود و دستور attribute خصیصه های کلاس و متد ها شامل دستوراتی است که متدهای مرتبط با کلاس را تعریف می کند - توجه کنید خصیصه های کلاس در داخل متد خاصی به نام Constructor یا سازنده هستند خصیصه های کلاس متغیرهایی هستند که داخل کلاس ساخته می شوند تعریف متد در کلاس شبیه تعریف تابع خارج از کلاس است هر متد در کلاس به صورت زیر تعریف می شود :

 

def methodName(self,parameters) :
    statements

Def واژه کلیدی زبان پایتون برای تعریف متد ( یا تابع ) هست و یک نام هم شما براش تعریف می کنید و واژه کلیدی Self باید به عنوان اولین پارامتر هر کلاس تعریف شود نقش آن این است وقتی متدی از یک شی فراخوانی شود وضعیت آن شی به آن متد ارسال می شود که قابل دستیابی و تغییر است ( وضعیت شی مقادیر فعلی خصیصه ها است ) و parameters لیست پارامترهاست که با کاما جدا شده و statments دستورالعمل هایی است که عملکرد متد را تعیین می کند 

بعد از ایجاد کلاس برای استفاده اشیا تعریف می شوند کلاس به عنوان الگویی برای تولید اشیا عمل می کند در هر شی فضای حافظه ای برای ذخیره خصیصه های آن اختصاص می یابد برای ایجاد شی از کلاس به صورت زیر عمل می کنیم :

objectName = className()

objectName نام شی که باید تعریف شود ClassName نام کلاسی است که می خواهیم شی از آن ایجاد شود و پرانتزها باز و بسته () نشان می دهد که هنگام ایجاد شی متد سازنده کلاس اجرا می شود و مسئولیت ایجاد شی از کلاس بر عهده سازنده آن است پس از ایجاد شی باید بتوانیم به اعضای آن ( خصیصه و متدها ) دسترسی داشت برای این از نام شی - یک نقطه - نام عضوی از شی استفاده می کنیم که می خواهیم به آن دسترسی داشته باشیم :

objectName.methodName()

objectName.attributeName

  دستور اول به یک متد از شی - و دومی به خصیصه ای از شی دسترسی می دهد 

 

متدسارنده کلاس و نقش متغیر Self :

 

متد سازند ی کلاس ، مسئول ایجاد اشیا از آن کلاس را برعهده دارد و به لحاظ ظاهر با متدهای دیگر کلاس کمی فرق دارد نام متد سازنده ی هر کلاس _  init _ است متد سازنده ( از سازنده ها برای مقداردهی اولیه وضعیت شی استفاده می شود) با متدهای دیگر سه فرق دارد :

 

- نام آن حتماً _INIT_ است 

- هنگام ایجاد شی از کلاس - به طور خودکار اجرا می شود و برنامه نویس آن را فراخوانی نمی کند 

- اولین پارامتر هر متد در هنگام تعریف Self است 

 

در بقیه موارد - مثل پارامترها - فراخوانی - برگرداندن مقدار به فراخوان و ... هیچ تفاوتی ندارد Self یک متغیر پیش فرض که شامل آدرس های حافظه ی شی جاری است و با آن می توان به خصیصه ها و متدهای شی جاری دسترسی داشته باشیم وقتی شی ایجاد شود نام آن شی حاوی آدرس مکان حافظه ی آن شی است این مکان حافظه به Self انتقال می یابد - در توضیحات بالا گفتیم سازنده کلاس نقش ایجاد شی از کلاس را دارد و خصیصه های کلاس در داخل این متد مقداردهی می شود ( مقدار اولیه می گیرد ) نمونه ای از متد سازنده را که ادامه آمده به صورت :

def_init_(self) :
    self.name = "ali"
    self.email = "ali@yahoo.com "
    self.ave = 15.5 

این متد سازنده عضوی از یک کلاس Student است وقتی شی از این کلاس ایجاد می شود سه خصیصه آن دارای مقدار اولیه هستند که مشاهده می کنید 

 

یک مثال - کلاس Student را با خصیصه ها و متد های زیر تعریف کنید :

 

Class Student 
Name - email - ave
sendmail() - verfy() - display()

 


class student:
def __init_(self, stName, stEmail, stAve):
self.name = stName
self.email = stEmail
self.ave stave
def display (self):
print (self.name, self.email, self.ave)
def senemail (self):
print ("We are going to send mail")
def verify (self):
print("We are going to verify the mail")

 

خط اول راس کلاس Student هست خط های 2 تا 5 متد سازنده _init_ را تعریف می کند که 4 پارامتر دارد - پارامتر اول همیشه Self و بعدی هم stName که نام دانشجو و الی آخر هستند خط سوم خصیصه Name را با مقدار پارامتر stName خواهد بود بقیه پارامتر ها هم مشاهده می کنید مشاهده می کنید که ()_init_ مقدار اولیه به خصیصه های کلاس می دهد و خطوط 6 و 7 هم متد display(self) هست که خصیصه های شی را به خروجی می برد و بقیه خطوط هم که مشخص هستند این مثال مفاهیم کلاس را توضیح و نشان می دهد 

 

پارامترهایی با مقدار پیش فرض در سازنده ها 

 

توابع می توانند دارای پارامتر باشند که این پارامترها دارای مقدار پیش فرض هستند این موضوع در مورد متدهای کلاس ، از جمله متد سازنده نیز صادق است برای مثال :

 

class Test:
    def __init__(self, a=10, b=20):
        self.x = a
        self.y = b

    def display(self):
        print("x =", self.x, ", y =", self.y)


# Driver program to test the class
ob1 = Test()
ob1.display()

ob2 = Test(15)
ob2.display()

ob3 = Test(b=25)
ob3.display()

ob4 = Test(24, 44)
ob3.display()

کلاس Test با متد ()_init_ و متد  ()display ایجاد شده و در نتیجه این کلاس داریم :

 

x = 10 , y = 20
x = 15 , y = 20
x = 10 , y = 25
x = 10 , y = 25

 

خط دوم متد سازنده ()_init_ را دارد که سه پارامتر دارد که self باید اولین آنها باشد پارامتر های a پیش فرض 10 و b هم 20 است به این معنی که اگر هنگام ایجاد شی از کلاس Test ، هیچ پارامتری ارسال نشود ، مقادیر پیش فرض همواره اعمال خواهند شد که به ترتیب در x و y قرار می گیرند متد  ()display خصیصه های کلاس test را در خروجی می برد خط 3 پارامتر a را در خصیصه x و سطر 4 پارامتر b را در خصیصه y قرار می دهد سطر های 5 و 6 متد ()display را برای چاپ خصیصه های کلاس Test یعنی x و y نشان می دهند از سطر 7 برنامه اصلی شروع می شود که در سطر 8 شی ob1 از نوع کلاس Test تعریف می شود ولی هیچ پارامتری به آن ارسال نخواهد شد لذا در این شی خصیصه ی x برابر 10 و خصیصه y هم 20 است سطر 9 این مقادیر را چاپ می کند و خط 10 شی ob2 از نوع کلاس test ایجاد می کند و 15 را به عنوان پارامتر می فرستد 15به جای a و به x نسبت داده می شود و b همان مقدار پیش فرض یعنی 20 را دارد و به y نسبت داده شده خط 11 در خروجی چاپ می کند و خط 12 هم ob3 را از نوع کلاس Test ایجاد می کند و پارامتر b را برابر با 25 قرار می دهد در نتیجه پارامتر a مقدار 10 را دارد و a به x و b به y نسبت داده می شود خط 13 این مقادیر را در خروجی نشان می دهد سطر 14 هم ob4 را با پارامترهای 24 و 24 ایجاد کرده که در a و b قرار می گیرند و a به x و b به y نسبت داده می شود سطر 15 این مقادیر را چاپ می کند 

 

مخرب ها : که Destructors هایی هستند که در پایان کار حذف می شوند تا فضای مصرفی توسط اشیا به سیستم عامل برگردد پایتون از Del استفاده می کند و متد به صورت _ del _ تعریف می شود برای مثال :

 

 

import math

class Circle:
    PI = math.pi
    
    def __init__(self, r):
        self.r = r
        
    def __del__(self):
        print("Object is deleted")
        
    def Area(self):
        return self.PI * (self.r * self.r)
    
    def Perimeter(self):
        return 2 * self.PI * self.r
    
    def __str__(self):
        s = "R: " + str(self.r)
        s += "\t\tArea: " + str(self.Area())
        s += "\t\tPerimeter: " + str(self.Perimeter())
        return s
        
r = int(input("Enter r: "))
c = Circle(r)
print(str(c))
del c

ماژول اصلی با متغیر های r و c که شعاع و نمونه ایجاد شده و برای Circle متغیر pi عدد ثابت پی و r عضو داده ای شعاع دایره و _ init _ متد سازنده که به عضو داده ای مقدار اولیه می دهد و این مقدار را از طریق پارامتر در هنگام ایجاد نمونه دریافت می کند و _ del _  متد مخرب که یک پیام نشان می دهد و متد Area که مساحت دایره را حساب می کند و Perime محیط دایره و متد _ str_ که مجدداً پیاده سازی انجام می دهد 

 

متدهای استاتیک :

اعضای کلاس می توانند داینامیک یا استاتیک باشند اگر عضوی از کلاس پویا باشد با نام نمونه می توان با آن دسترسی یافت و اگر فقط با نام کلاس فراخوانی شوند از استاتیک متد ها هستند اگر قبل از متدی استفاده شود با عنوان staticmethod بوده دیگر نمی توان با نام نمونه به آن دسترسی داشت به عنوان مثال دستور زیر را :

 

class static :
    staticmethod 
    def display() :
        print( " Static Method ")

 

برای مثال متدی که عددی را بگیرد و نشان دهد آیا اول است یا خیر با استفاده از staticmethod :

 

import math

class Math:
    staticmethod
    def isOdd(n):
        return n % 2 != 0

    staticmethod
    def isEven(n):
        return n % 2 == 0

    staticmethod
    def isSquare(n):
        i = 0
        while i * i <= n:
            if i * i == n:
                return True
            i = i + 1
        return False

    staticmethod
    def isPrime(n):
        if n <= 1:
            return False
        for i in range(2, int(math.sqrt(n)) + 1):
            if n % i == 0:
                return False
        return True

    staticmethod
    def isPerfect(n):
        sum = 0
        for i in range(1, n // 2 + 1):
            if n % i == 0:
                sum += i
        return sum == n

n = int(input("Enter n: "))
print("Is Odd?", Math.isOdd(n))
print("Is Even?", Math.isEven(n))
print("Is Square?", Math.isSquare(n))
print("Is Prime?", Math.isPrime(n))
print("Is Perfect?", Math.isPerfect(n))

 

در مثال بالا کلیه متد ها از نوع استاتیک هستند که یک عدد را به عنوان پارامتر دریافت می کنند و تشخیص فرد بودن یا نبودن آن را می دهد 

 

پنهان سازی اطلاعات :

 

برای اعضای کلاس سطح دسترسی ایجاد می کنیم تا از دیدکاربران پنهان بماند در حالت عادی اعضای داده ای و متدی کلاس به صورت عمومی ( Public ) تعریف می شود یعنی از بیرون کلاس می توان به آنها دسترسی داشت اما گاهی نیاز داریم تا آنها را خصوصی یا (  Private ) داشته باشیم برای اینکار قبل از نام عضو _ قرار می دهیم برای مثال :

class Square :
    _x = 0 

برای دسترسی به آن از متدهای دست یابی استفاده می کنند این متدها برای مقداردهی و بازیابی مقدار اولیه فیلد به کار می روند برای مثال :

class Square :
    _x = 0 
    def Setx(self, x ) : self._x = x if x>= 0 else 0 
    def Getx(self) : return self._x 

برای مثال :

 

class Square:
    def __init__(self, x):
        self.Setx(x)

    def __del__(self):
        print("object is deleted")

    def Setx(self, x):
        self._x = x if x >= 0 else 0

    def Getx(self):
        return self._x

    def Area(self):
        return self._x ** 2

    def Perimeter(self):
        return 4 * self._x

    def __str__(self):
        s = "X: " + str(self._x)
        s += "\t\tArea: " + str(self.Area())
        s += "\t\tPerimeter: " + str(self.Perimeter())
        return s

x = int(input("Enter x: "))
s = Square(x)
print(str(s))
del s

 

 

- وراثت و چند ریختی :

 

 

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی