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

След като много хора от курса проявиха интерес колко точно динамичен е 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 *

*
*