|
|||
@staticmethod 3 страница
П р о н а б л ю д а й т е, к а к м е т о д __init__ и с п о л ь з у е т с я д л я и н и ц и а л и з а ц и и э к з е м п л я р а Robot
и м е н е м. В э т о м м е т о д е м ы у в е л и ч и в а е м с ч ё т ч и к population н а 1, т а к к а к д о б а в л я е м е щ ё о д н о г о р о б о т а. Т а к ж е з а м е т ь т е, ч т о з н а ч е н и я self. name д л я к а ж д о г о о б ъ е к т а с в о и, ч т о у к а з ы в а е т н а п р и р о д у п е р е м е н н ы х о б ъ е к т а.
П о м н и т е, ч т о к п е р е м е н н ы м и м е т о д а м с а м о г о о б ъ е к т а н у ж н о о б р а щ а т ь с я, п о л ь з у я с ь т о л ь к о self. Э т о н а з ы в а е т с я д о с т у п о м к а т р и б у т а м .
э т о м п р и м е р е м ы т а к ж е н а б л ю д а л и п р и м е н е н и е с т р о к д о к у м е н т а ц и и д л я к л а с с о в, р а в -н о к а к и д л я м е т о д о в. В о в р е м я в ы п о л н е н и я м ы м о ж е м о б р а щ а т ь с я к с т р о к е д о к у м е н т а -ц и и к л а с с а п р и п о м о щ и “Robot. __doc__”, а к с т р о к е д о к у м е н т а ц и и м е т о д а – п р и п о м о щ и “Robot. sayHi. __doc__”.
Н а р я д у с м е т о д о м __init__, с у щ е с т в у е т и д р у г о й с п е ц и а л ь н ы й м е т о д __del__, к о т о р ы й в ы з ы в а е т с я т о г д а, к о г д а о б ъ е к т с о б и р а е т с я у м е р е т ь, т. е. к о г д а о н б о л ь ш е н е и с п о л ь з у е т с я, з а н и м а е м а я и м п а м я т ь в о з в р а щ а е т с я о п е р а ц и о н н о й с и с т е м е д л я д р у г о г о и с п о л ь з о в а -н и я. В э т о м м е т о д е м ы п р о с т о у м е н ь ш а е м с ч ё т ч и к Robot. population н а 1.
М е т о д __del__ з а п у с к а е т с я л и ш ь т о г д а, к о г д а о б ъ е к т п е р е с т а ё т и с п о л ь з о в а т ь с я, а п о э т о м у з а р а н е е н е и з в е с т н о, к о г д а и м е н н о э т о т м о м е н т н а с т у п и т. Ч т о б ы у в и д е т ь е г о в д е й с т в и и я в н о, п р и д ё т с я в о с п о л ь з о в а т ь с я о п е р а т о р о м del, ч т о м ы и с д е л а л и в ы ш е.
П р и м е ч а н и е д л я п р о г р а м м и с т о в н а C++/Java/C#
Python в с е ч л е н ы к л а с с а (в к л ю ч а я д а н н ы е ) я в л я ю т с я п у б л и ч н ы м и (public), а в с е м е т о д ы
– в и р т у а л ь н ы м и (virtual).
И с к л ю ч е н и е: Е с л и и м я п е р е м е н н о й н а ч и н а е т с я с д в о й н о г о п о д ч ё р к и в а н и я , к а к, н а п р и м е р, __privatevar, Python д е л а е т э т у п е р е м е н н у ю п р и в а т н о й (private). П о э т о м у п р и н я т о и м я л ю б о й п е р е м е н н о й, к о т о р а я д о л ж н а и с п о л ь з о в а т ь с я т о л ь к о в н у т р и к л а с с а и л и о б ъ е к т а, н а ч и н а т ь с п о д ч ё р к и в а н и я; в с е ж е о с т а л ь н ы е и м е н а я в л я ю т с я п у б л и ч н ы м и, и м о г у т и с -п о л ь з о в а т ь с я в д р у г и х к л а с с а х /о б ъ е к т а х. П о м н и т е, ч т о э т о л и ш ь т р а д и ц и я, и Python в о в с е н е о б я з ы в а е т д е л а т ь и м е н н о т а к (к р о м е д в о й н о г о п о д ч ё р к и в а н и я ).
14. 5. П е р е м е н н ы е к л а с с а и о б ъ е к т а 107 A Byte of Python (Russian), В е р с и я 2. 01
14. 6 Н а с л е д о в а н и е
О д н о и з г л а в н ы х д о с т о и н с т в о б ъ е к т н о -о р и е н т и р о в а н н о г о п р о г р а м м и р о в а н и я з а к л ю ч а -е т с я в м н о г о к р а т н о м и с п о л ь з о в а н и и о д н о г о и т о г о ж е к о д а, и о д и н и з с п о с о б о в э т о г о д о с т и ч ь – п р и п о м о щ и м е х а н и з м а н а с л е д о в а н и я . Л е г ч е в с е г о п р е д с т а в и т ь с е б е н а с л е д о -в а н и е в в и д е о т н о ш е н и я м е ж д у к л а с с а м и к а к т и п и п о д т и п .
П р е д с т а в и м, ч т о н а м н у ж н о н а п и с а т ь п р о г р а м м у, к о т о р а я о т с л е ж и в а е т и н ф о р м а ц и ю о п р е п о д а в а т е л я х и с т у д е н т а х в к о л л е д ж е. У н и х е с т ь н е к о т о р ы е о б щ и е х а р а к т е р и с т и к и: и м я, в о з р а с т и а д р е с. Е с т ь т а к ж е и с п е ц и ф и ч е с к и е х а р а к т е р и с т и к и, т а к и е к а к з а р п л а т а, к у р с ы и о т п у с к д л я п р е п о д а в а т е л е й, а т а к ж е о ц е н к и и о п л а т а з а о б у ч е н и е д л я с т у д е н т о в.
М о ж н о с о з д а т ь д л я н и х н е з а в и с и м ы е к л а с с ы и р а б о т а т ь с н и м и, н о т о г д а д о б а в л е н и е к а к о й -л и б о н о в о й о б щ е й х а р а к т е р и с т и к и п о т р е б у е т д о б а в л е н и я е ё к к а ж д о м у и з э т и х н е з а в и с и м ы х к л а с с о в в о т д е л ь н о с т и, ч т о д е л а е т п р о г р а м м у н е п о в о р о т л и в о й.
Л у ч ш е с о з д а т ь о б щ и й к л а с с с и м е н е м SchoolMember, а з а т е м с д е л а т ь т а к, ч т о б ы к л а с с ы п р е п о д а в а т е л я и с т у д е н т а н а с л е д о в а л и э т о т к л а с с, т. е. ч т о б ы о н и с т а л и п о д т и п а м и э т о г о т и п а (к л а с с а ), п о с л е ч е г о д о б а в и т ь л ю б ы е с п е ц и ф и ч е с к и е х а р а к т е р и с т и к и к э т и м п о д т и -п а м.
т а к о г о п о д х о д а е с т ь м н о ж е с т в о д о с т о и н с т в. Е с л и м ы д о б а в и м /и з м е н и м к а к у ю -л и б о ф у н к ц и о н а л ь н о с т ь в SchoolMember, э т о а в т о м а т и ч е с к и о т о б р а з и т с я и в о в с е х п о д т и п а х. Н а п р и м е р, м ы м о ж е м д о б а в и т ь н о в о е п о л е у д о с т о в е р е н и я д л я п р е п о д а в а т е л е й и с т у д е н -т о в, п р о с т о д о б а в и в е г о к к л а с с у SchoolMember. С д р у г о й с т о р о н ы, и з м е н е н и я в п о д т и п а х н и к а к н е в л и я ю т н а д р у г и е п о д т и п ы. Е щ ё о д н о д о с т о и н с т в о с о с т о и т в т о м, ч т о о б р а щ а т ь -с я к о б ъ е к т у п р е п о д а в а т е л я и л и с т у д е н т а м о ж н о к а к к о б ъ е к т у SchoolMember, ч т о м о ж е т б ы т ь п о л е з н о в р я д е с л у ч а е в, н а п р и м е р, д л я п о д с ч ё т а к о л и ч е с т в а ч е л о в е к в ш к о л е. К о -г д а п о д т и п м о ж е т б ы т ь п о д с т а в л е н в л ю б о м м е с т е, г д е о ж и д а е т с я р о д и т е л ь с к и й т и п, т. е. о б ъ е к т с ч и т а е т с я э к з е м п л я р о м р о д и т е л ь с к о г о к л а с с а, э т о н а з ы в а е т с я п о л и м о р ф и з м о м.
З а м е т ь т е т а к ж е, ч т о к о д р о д и т е л ь с к о г о к л а с с а и с п о л ь з у е т с я м н о г о к р а т н о , и н е т н е о б х о -д и м о с т и к о п и р о в а т ь е г о в о в с е х к л а с с ы, к а к п р и ш л о с ь б ы в с л у ч а е и с п о л ь з о в а н и я н е з а -в и с и м ы х к л а с с о в.
К л а с с SchoolMember в э т о й с и т у а ц и и н а з ы в а ю т б а з о в ы м к л а с с о м и л и н а д к л а с с о м 3. К л а с с ы Teacher и Student н а з ы в а ю т п р о и з в о д н ы м и к л а с с а м и и л и п о д к л а с с а м и 4.
Р а с с м о т р и м т е п е р ь э т о т п р и м е р в в и д е п р о г р а м м ы (с о х р а н и т е к а к inherit. py).
class SchoolMember:
'''П р е д с т а в л я е т л ю б о г о ч е л о в е к а в ш к о л е. ''' def __init__(self, name, age): self. name = name
self. age = age
print ('(С о з д а н SchoolMember: {0})'. format(self. name))
def tell(self):
т а к ж е «с у п е р к л а с с », ‘«р о д и т е л ь с к и й к л а с с » (п р и м. п е р е в. ) 4 т а к ж е «с у б к л а с с », «к л а с с -н а с л е д н и к » (п р и м. п е р е в. )
108 Г л а в а 14. О б ъ е к т н о -о р и е н т и р о в а н н о е п р о г р а м м и р о в а н и е A Byte of Python (Russian), В е р с и я 2. 01
'''В ы в е с т и и н ф о р м а ц и ю. '''
print ('И м я: " {0}" В о з р а с т: " {1}" '. format(self. name, self. age), end=" " )
class Teacher (SchoolMember):
'''П р е д с т а в л я е т п р е п о д а в а т е л я. '''
def __init__(self, name, age, salary): SchoolMember. __init__(self, name, age) self. salary = salary print ('(С о з д а н Teacher: {0})'. format(self. name))
def tell(self):
SchoolMember. tell(self)
print ('З а р п л а т а: " {0: d}" '. format(self. salary))
class Student (SchoolMember):
'''П р е д с т а в л я е т с т у д е н т а. '''
def __init__(self, name, age, marks): SchoolMember. __init__(self, name, age) self. marks = marks print ('(С о з д а н Student: {0})'. format(self. name))
def tell(self):
SchoolMember. tell(self)
print ('О ц е н к и: " {0: d}" '. format(self. marks))
= Teacher('Mrs. Shrividya', 40, 30000) s = Student('Swaroop', 25, 75)
print ()#п е ч а т а е т п у с т у ю с т р о к у
members = [t, s]
for member in members:
member. tell() # р а б о т а е т к а к д л я п р е п о д а в а т е л я, т а к и д л я с т у д е н т а
В ы в о д:
$ python3 inherit. py
(С о з д а н SchoolMember: Mrs. Shrividya)
(С о з д а н Teacher: Mrs. Shrividya)
(С о з д а н SchoolMember: Swaroop)
(С о з д а н Student: Swaroop)
И м я: " Mrs. Shrividya" В о з р а с т: " 40" З а р п л а т а: " 30000"
|
|||
|