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

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

class Person(object):
    def __init__(self, name):
        self.name = name

    def greet(self, someone):
        print "Hi %s, I’m %s!" % (someone, self.name)

class NamedThing(object):
    def sayMyName(self):
        print "Beware, for I am %s" % self.name

popStarClass = type(‘PopStar’, (Person, ), {})
popStarClass.__bases__ = (Person, NamedThing)

def popStarGreet(self, someone):
    super(popStarClass, self).greet(someone)
    print "Do you want my autograph?"
popStarClass.greet = popStarGreet

popStar = popStarClass("Mityo the Python")
popStar.greet("Dim")
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 thoughts on “Динамичен питон

Вашият коментар

Вашият имейл адрес няма да бъде публикуван.