Showing posts with label python. Show all posts
Showing posts with label python. Show all posts

2012-04-14

Python Metaclass


Энгийн байна гэдэг бол 
Маш олон асуудалыг шийдэх шидэт түлхүүр

Би ойрд ажил ихтэй код бичээд амралт багатай. Өлөө ирээд нухаж гарна орой болтол нухаад л байна. Гэдэг шиг ажил ихтэй завгүй талдаа л байна. Хавар цаг болоод олон хүмүүс хямралдаад за за хадуурлаа... гол хэсэгрүүгээ ороё.

Нэг сонирхолтой сэдэв нэлээд дээхэн үед Learning python гээд хальт нэг оньсого шиг юм бичсэн тэрний 1-р бичигдсэн Metaclass ийн хэрэглээний талаар товчхон ойлголт өгөх гэж оролдоё. Энэ аргийг маш өргөн хэрэглэж байгаа учраас зарим Framework ийн кодруу харж байгаад жишээ болгоод тайлбарлая. 

Django ийн талаар олон юм нурших нь илүү байх. Харин Django ийн forms.Form классыг бүгд мэдэх байх. Энэ нөхөр хэрхэн ажиллаж байгааг арай өөр өнцөгөөс харая.

Бид form class ийг бичихдээ ихэвчлэн дараах хэлбэрээр бичдэг. 

Loading ....


Энэ хэсэг бол ямар нэг илүү юм бичигдэхгүй тун жижхэн код байгаа. Хэрхэн ашиглах энэ сэдэвт хамаагүй учир орхилоо. 

Харин яаж ажиллаад байгааг нь тайлбарлая. Бидны класс forms.Form классаас удамшисан байгаа. Энэ классын зарлалт нь forms.py#L383 мөр дээр байгааг харж болно. Энэ класс нь BaseForm классаас удамшиж байгаа. Мөн нэг __metaclass__ гэсэн талбарт DeclarativeFieldsMetaclass утгыг өгсөн байгааг харж болно. 
Loading ....

Завсарлага 5 мин :)




DeclarativeFieldsMetaclass нь type классаас удамшиж байгаа энэ нь Python ийн үндсэн object классын үүсгэгч класс. энэ класс нь __new__ функцийг дахин тодорхойлож бүх талбарууд (attrs) дээр үйлдэл хийж байгааг харж болно. Энэ функ нь python ийн process үүсэх үед нэг удаа ажилладаж class төрлийн instance ийг үүсгэн бэлтгэж байгаа учираас классийн __init__ функцээс ялгаатай.

Loading ....


Дээрх кодын __new__ функц дотор get_declared_fields функцийн үр дүнг base_fields талбар үүсгэн хадгалаж байгааг харж болно. Энэ base_fields талбарийн хэрэглэж байгаа байдалийг BaseForm classын __init__ функц дотор  self.fields = copy.deepcopy(self.base_fields) гэсэн мөрийг анхаарах хэрэгтэй энэ нь яагаад copy хийж байгаа шалтгаанаа тайлбарлаж бичсэнийн анхааралтай уншаарай. Шалтгаан нь base_fields ийг шинэ Form instance -уудыг үүсгэх үед хэрэглэж байгаа учраас.

За товчхондоо metaclass ийг django дээр иймэрхүү байдалаар хэрэглэж байгаа. Энэ нь тухайн framework ийг хэрэглэж байгаа хүний бичих кодыг багасгах цэгцтэй болгох гэх мэт маш олон давуу талуудыг үүсгэж байгааг харж болно. Мөн Django ийн Model дээр metaclass хэрэглэж байгааг үзэж болно.

Цаашлаад metaclass-ийг удамшилуулах class уудын удамшилд хэрхэн нөлөөлөж байгааг хараахан ойлгож амжаагүй байгаа....

2011-04-13

Open code

Python, python, python 
бас дахиад python

Python оролдож эхэлсэнээс хойш нэлээдгүй хугацаа өгөрч янзан бүрийн зүйлүүдийг хийж туршиж бүр зармыг нь унагааж үзэв дээ. Болхоосоо болохгүй нь дийлэнх нь байлаа. Болгох гэж өдөр шөнөгүй л суулаа. Амархан зүйл гэж хаана ч байхгүй гэдгийг л сайн мэдрэж байна даа.  Чамалхаар чанга атга...

Django Translation MN
Django ийн орчуулагын найруулгыг нь засварлаж 1.3 хувилбарт хэсэг нөхдийн хамтаар орчуулав. Орчуулагад идвэхтэй оролцсон найзууддаа баяраллаа.

Тоог үсэгрүү хөрвүүлэх жижиг скрипт
Тоог үсэгрүү хөрвүүлэх script энийг нэлээд олон хүн хийж байсан байх гэхдээ нээлттэй хэлбэрээр код нь байхгүй дан ямар нэг газар дараастай мартагдсан байдаг байх. Үүнийг python хэл дээр хийж кодыг нээлттэй байрлуулсаныг идвэхтэн ХАСАА дэмжиж JS дээр ажиллах хувилбар хийн мөн нээлттэй байрлуулсан байгаа. Сонирхоод үзээрэй.


Монгол банкны ханш харуулах widget
Энэ жижхэн widget ийг хийх гэж 80 юм болсон. Жижхэн энгийн юм шиг хэрнээ хөөрхөн ажил болов оо. Хажуугаар нь монгол банкны вэб нь солигдоод мөн вэб нь намайг хийж байхад доголдоод баахан нэрэвтүүлэв. Одоо сайхан ажилладаг болсоон. Ажиллахгүй байх үед нь яаахуу эд нар гээд нэлээд нөхцөл тооцсон. Ашиглах зааварыг нь http://monxansh.appspot.com/ ээс үзээрэй. 

2010-07-07

Learning Python ...


Сүүлийн үед Python ийг нэлээд их сонирхож судлаж байна. Ажлын шаардлагаар  үр дүнтэй зүйл хийх гэж үзэж таржийна аа.  Ёстой нээрээ юм хөгжино өө гэж дуу алдамаар гоё гоё санаанууд энд тэнд их байна шүү. Хамаагүй зүйл бичүүл байгууллагын нууц задалсан хэрэгт унана. 

Python дээр гоё гэмээр хачин ч гэмээр ойлголтууд их байна аа. Заримаас нь дурдвал.
1. Metaclass - Ерөнхий санаа нь Класс-ийг үүсгэдэг класс гэх юм уу даа. Бид Класс залраж байгаад түүнээс Instance үүсгэж ашигладаг түүнтэй зарчим нь адилхан. 
2. Decorator - Энэ бас их сонирхолтой. функц үүсгэдэг функц гэж хэлж болхоор. Бичлэг нь их эвтэйхэн. 

# Jijighen jishee code
class mydecorator(type):
    def __init__(self, func):
        print "function zarlagdav"
        self.func = func
    def __call__(self, *args, *kwargs):
        print "function buruu ajillav :)"

@mydecorator
def testfuncion(arg1,):
     print "test function"

3. Aspect санаа нь болхоор AOP ийг python дээр хэрэгжүүлсэн байдал. Үүнийг нэлээд дээхэнэ Ochko ахын семинар дээр сонсож байсан боловч ямар хэрэгтэйг нь ойлгохгүй гайхаад өнгөрч билээ. 

4. Inspect шалгагч модуль. Класс болон модуль юу л байна бүгдийг нь хаанаас гаралтай юу вэ гэдэг талаар маш их мэдээлэл өгнө.