۱۱/۲۵/۱۳۸۸

برنامه نویسی شیء گرا - قسمت سوم

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

class MyMath(object):

    @staticmethod
    def fac(n):
        '''factorial of a number (a recursive method)'''
        return 1 if not n else n*MyMath.fac(n-1)


>>> MyMath.fac(5)
120
>>> aInstance=MyMath()
>>> aInstance.fac(5)
120
>>> 


همونطور که دیدیداصلا نیازی به نمونه گرفتن از کلاس نبود.

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

class Timer():
    '''
    An easy to use timer which

    reminds me of a VB8 stopwatch :D
    It uses python time module
    '''
    #double underlines __ here make
    #__time a private  attribute
    __time=0

    #making reset a static method, there is
    #no more need for a self argument.

    #instead reset=staticmethod(reset)
    #I use a decorator
    @staticmethod
    def reset():
        '''

        updates the starting time
        with local time
        '''
        from time import time
        Timer.__time=time()



    @staticmethod
    def elapsed():
        '''

        elapsed seconds since last reset() call
        '''
        from time import time
        return time()-Timer.__time

 
حالا من این کلاس را در فایل myassets.py و در این آدرس "E:\My Projects" ذخیره میکنم. 
حالا اگر بخواهیم در هر برنامه ای که در همین آدرس ذخیره شده از این کلاس استفاده کنیم کافیست بنویسیم


from myassets import Timer

Timer.reset()
# a block of code

#
print Timer.elapsed(), 'Seconds!'


اما اگر برنامه در آدرس دیگری ذخیره شده باشد مینویسیم
 
import sys
sys.path.append('E:\My Projects')
#now we can import any module from this address

#the rest is just the same

#instead of importing only Timer class
#I import everything that can be imported!
#into this module using *
from myassets import *

Timer.reset()
# a block of code
#
print Timer.elapsed(), 'Seconds!'


 برای اطلاعات بیشتر در مورد ماژول sys به اینجا و در مورد ماژول time به اینجا مراجعه کنید.

موفق باشید ☻ 

 

هیچ نظری موجود نیست:

ارسال یک نظر