View Full Version : سوال: داده استاتیک بیرون از کلاس
sahama
چهارشنبه 27 اردیبهشت 1391, 02:03 صبح
با سلام
فرض کنید ۲ تابع به این شکل داریم:
def f1(i):
print i
def f2(f, i):
f(i)
تعداد آرگومانهای هر تابع غیر قابل تغییر است (همچین شکلی مال یه فریم ورک است که دارم ازش استفاده می کنم)
حالا فرض کنید بخواهیم یه شمارنده برای تابع اول بذاریم این رو من به این شکا پیاده کردم ولی قشنگ نیست
class staticdata:
n = 0
def f1(i):
print i
staticdata.n += 1
def f2(f, i):
f(i)
چیزی به ذهنتون می رسه که قشنگ تر از این باشه؟
weox__
پنج شنبه 28 اردیبهشت 1391, 22:56 عصر
روش پیاده سازی داده استاتیک توی پیتون به همین نحو هست .
منظورتون از قشنگ بودن چی هست ؟؟ لطفا توضیح بدین ... فاکتوری بنام قشنگی من نمی بینم تو این کد
sahama
شنبه 30 اردیبهشت 1391, 17:06 عصر
سلام
متن سوال رو یه بار دیگه بخونید. هدف داده استاتیک نیست بلکه شمارنده است. اینکه می گم قشنگ نیست به این علته که مجبور شدم برای ساخت یه شمارنده یه کلاس جدید تعریف کنم
در حالی که توی C++ اینطور نیست برای ساخت یه شمارنده براحتی عمل می کنیم
weox__
یک شنبه 31 اردیبهشت 1391, 16:40 عصر
def foo():
foo.counter += 1
print "Counter is %d" % foo.counter
foo.counter = 0
داده استاتیک برای تابع .
sahama
یک شنبه 31 اردیبهشت 1391, 21:14 عصر
با سلام
جواب:
http://www.pylearn.com/fa/forum//index.php?topic=1661.0
weox__
یک شنبه 31 اردیبهشت 1391, 23:22 عصر
بنظر می رسه دوست عزیز شما جواب پست هاتون رو نمیخونید !!
نیازی به کلمه کلیدی global نیست . پیتون خودش برای این راه ذکر نام تابع رو (به جای گلوبال ) پیشنهاد میده (هرچند زیاد فرقی ندارن )
ذکر کلمه کلیدی global تقریبا بی مورد هست .
به دو دلیل این روشی که دوستمون ارائه کردن به هیچ وجه توصیه و تایید نمی شه :
1. درسته پیتون شی گرای صرف نیست . و حفاظت از دسترسی ها در پیتون پیاده نشده . ولی تعریف یه متغیر گلوبال برای فقط یه شمارنده یه مورد غیر ضروری و بعدا در کد ها ممکن است دچار مشکل شوید (به علت دسترسی غیر مجاز غیر عمدی) .(که تعیین متغیر سراسری مختص تابع جلوی این مشکل تا حد بسیار زیادی گرفته می شه ، هرچند بازم می گم در پیتون چیزی بنام حفاظت دسترسی وجود نداره)
2..در برنامه های پیچیده و چند هزار سطری شما لزوما باید تا جای ممکن کدتون خوانا و مشخص باشه . با روشی که پیتون برای داده ی استاتیک برای یک تابع(همونطور که بالا ذکر کردم) ارائه و پیشنهاد می ده(به جای استفاده از متغیر سراسری ) بعدا در خوانایی کد های پیچیده به مشکلی نخواهید خورد .
sahama
دوشنبه 01 خرداد 1391, 21:30 عصر
با سلام
روش شما برای من یه ایراد داره و اونم اینه که اول باید تابع تعریف بشه تا بتونم شمارنده رو به اون متصل کنم ولی با استفاده از global این مشکل برای من وجود نداره و با توجه به کدی که من دارم ازش استفاده می کنم استفاده از global برتری داره
اما به هر حال ممنون چون چیز جدیدی رو یاد گرفتم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.