След като много хора от курса проявиха интерес колко точно динамичен е Python, реших да съставя малко примерче как „динамично“ (т.е. по време на изпълнение) може да си конструираме изцяло нов клас. Наслаждавайте се!
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()
Резултата, както може да се очаква е:
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, можете да създадете доста по-гъвкъв програмен модел с такива истории. Или ако искате, да си изкодите собствена механика за Аспектно-ориентирано програмиране. Бе всъщност, бая неща можете да направите и всичките са интересни, но ако създавате краен продукт, а не инструмент, едва ли ще ви се наложи да ги ползвате. И все пак е готино.
Ся, понеже гледам си зачекнал темата – да постна една връзчица – Кой живее в гаража? http://www.vbox7.com/play:bb255ea4
Палавник…