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