Динамичен питон

След като много хора от курса проявиха интерес колко точно динамичен е Python, реших да съставя малко примерче как „динамично“ (т.е. по време на изпълнение) може да си конструираме изцяло нов клас. Наслаждавайте се!

Python [Show Plain Code]:
  1. class Person(object):
  2.     def __init__(self, name):
  3.         self.name = name
  4.  
  5.     def greet(self, someone):
  6.         print "Hi %s, I’m %s!" % (someone, self.name)
  7.  
  8. class NamedThing(object):
  9.     def sayMyName(self):
  10.         print "Beware, for I am %s" % self.name
  11.  
  12. popStarClass = type(‘PopStar’, (Person, ), {})
  13. popStarClass.__bases__ = (Person, NamedThing)
  14.  
  15. def popStarGreet(self, someone):
  16.     super(popStarClass, self).greet(someone)
  17.     print "Do you want my autograph?"
  18. popStarClass.greet = popStarGreet
  19.  
  20. popStar = popStarClass("Mityo the Python")
  21. popStar.greet("Dim")
  22. popStar.sayMyName()

Резултата, както може да се очаква е:

Hi Dim, I'm Mityo the Python!
Do you want my autograph?
Beware, for I am Mityo the Python

Сега, да разясня. Първо си декларирам два класа, които ще ползвам малко по-надолу. След което съставям нов тип, който наследява Person и се казва PopStar. Името е без голямо значение. Последния речник представлява атрибутите на класа (статични променливи, методи и т.н.), които засега са никакви. На 13 ред решавам да размисля и да променя родителските класове—добавям NamedThing. Обърнете внимание как може да промените наследниците на вече създаден клас.

По-натам решавам да добавя нов метод. По-точно, да предефинирам greet. Правя си съвсем нормално тази функция, която взема self като първи аргумент. После решавам, че искам да викам родителския greet. Обърнете внимане как го правя със super—без въобще да ме интересува как се казват родителите. Ако сте слушали на лекцията в сряда, знаете, че първо се търси в Person, а после в NamedThing. След това, в същия метод нашата поп звезда пита дали искате автограф. След като съм сглобил popStarGreet го слагам като атрибут на класа, който съм си създал—popStarClass.

После си правя нова инстанция по съвсем познатия начин и съвсем в духа на последната лекция. Както виждате, нейния метод работи точно както очаквах и е наследила метода sayMyName от NamedThing.

Динамика на буци. Дали има някакъв смисъл от това? Всъщност, има—когато правите някакъв framework на Python, можете да създадете доста по-гъвкъв програмен модел с такива истории. Или ако искате, да си изкодите собствена механика за Аспектно-ориентирано програмиране. Бе всъщност, бая неща можете да направите и всичките са интересни, но ако създавате краен продукт, а не инструмент, едва ли ще ви се наложи да ги ползвате. И все пак е готино.

2 Comments

  1. Posted March 17, 2007 at 2:17 pm | Permalink

    Ся, понеже гледам си зачекнал темата—да постна една връзчица—Кой живее в гаража?
    http://www.vbox7.com/play:bb255ea4

  2. Posted March 17, 2007 at 2:24 pm | Permalink

    Палавник…

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*