تا اینجا هر متودی که برای یک کلاس تعریف کردیم به عنوان اولین ورودی همیشه اون نمونه ای از کلاس که صدا میزدش را میگرفت. دقت کنید که لزومی ندارد اسم این ورودی را "سلف" بگزاریم ولی تقریبا همه ی برنامه نویس های پایتون این اسم را انتخاب میکنند.
دسته ای دیگر از متودها، متودهای استاتیک اند که مستقل از نمونه های یک کلاس اند. یعنی به ازای ورودیهای یکسان همیشه یک خروجی دارند و این به نمونه ای از کلاس که آنها را صدا میزند ربطی ندارد. حتی برای صدا زدن این متودها نیازی به ساختن یک نمونه از کلاس هم نیست.
من اینجا تابع فاکتوریل را به صورت یک متود استاتیک با استفاده از دکوراتورها تعریف میکنم
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)
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
120
>>> aInstance=MyMath()
>>> aInstance.fac(5)
120
>>>
#the rest is just the same
Timer.reset()
# a block of code
#
print Timer.elapsed(), 'Seconds!'
>>> 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
'''
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!'
Timer.reset()
# a block of code
#
print Timer.elapsed(), 'Seconds!'
اما اگر برنامه در آدرس دیگری ذخیره شده باشد مینویسیم
import sys
sys.path.append('E:\My Projects')
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 *
from myassets import *
Timer.reset()
# a block of code
#
print Timer.elapsed(), 'Seconds!'
موفق باشید ☻
هیچ نظری موجود نیست:
ارسال یک نظر