След като много хора от курса проявиха интерес колко точно динамичен е 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 Comments
Ся, понеже гледам си зачекнал темата - да постна една връзчица - Кой живее в гаража?
http://www.vbox7.com/play:bb255ea4
Палавник…