Хелпикс

Главная

Контакты

Случайная статья





@staticmethod 2 страница



 

М е т о д __init__ з а п у с к а е т с я, к а к т о л ь к о о б ъ е к т к л а с с а р е а л и з у е т с я. Э т о т м е т о д п о л е з е н д л я о с у щ е с т в л е н и я р а з н о г о р о д а и н и ц и а л и з а ц и и , н е о б х о д и м о й д л я д а н н о г о о б ъ е к т а. О б -р а т и т е в н и м а н и е н а д в о й н ы е п о д ч ё р к и в а н и я в н а ч а л е и в к о н ц е и м е н и.

 

П р и м е р: (с о х р а н и т е к а к class_init. py)

 

14. 3. М е т о д ы о б ъ е к т о в

A Byte of Python (Russian), В е р с и я 2. 01

 

class Person:

 

def __init__(self, name):

 

self. name = name

 

def sayHi(self):

 

print ('П р и в е т! М е н я з о в у т ', self. name)

 

= Person('Swaroop') p. sayHi()

 

Э т о т к о р о т к и й п р и м е р м о ж н о т а к ж е з а п и с а т ь к а к Person('Swaroop'). sayHi()

 

В ы в о д:

 

$ python3 class_init. py

 

П р и в е т! М е н я з о в у т Swaroop

 

К а к э т о р а б о т а е т:

 

З д е с ь м ы о п р е д е л я е м м е т о д __init__ т а к, ч т о б ы о н п р и н и м а л п а р а м е т р name (н а р я д у с о б ы ч н ы м self). Д а л е е м ы с о з д а ё м н о в о е п о л е с и м е н е м name. О б -р а т и т е в н и м а н и е, ч т о э т о д в е р а з н ы е п е р е м е н н ы е, д а ж е н е с м о т р я н а т о, ч т о о н и о б е н а з в а н ы name. Э т о н е п р о б л е м а, т а к к а к т о ч к а в в ы р а ж е н и и self. name о б о з н а ч а е т, ч т о с у щ е с т в у е т н е ч т о с и м е н е м «name», я в л я ю щ е е с я ч а с т ь ю о б ъ -е к т а «self», и д р у г о е name – л о к а л ь н а я п е р е м е н н а я. П о с к о л ь к у м ы в я в н о м в и д е у к а з ы в а е м, к к о т о р о м у и м е н и м ы о б р а щ а е м с я, п у т а н и ц ы н е в о з н и к н е т.

 

В а ж н о о т м е т и т ь, ч т о п р и с о з д а н и и н о в о г о э к з е м п л я р а к л а с с а м ы н е в ы з ы в а е м м е т о д __init__ я в н ы м о б р а з о м, а п е р е д а ё м а р г у м е н т ы в с к о б к а х п о с л е и м е н и э т о г о к л а с с а. В э т о м и з а к л ю ч а е т с я с п е ц и а л ь н а я р о л ь д а н н о г о м е т о д а.

 

П о с л е э т о г о м ы п о л у ч а е м в о з м о ж н о с т ь и с п о л ь з о в а т ь п о л е self. name в н а ш и х м е т о д а х, ч т о и п р о д е м о н с т р и р о в а н о в м е т о д е sayHi.

 

 

14. 5 П е р е м е н н ы е к л а с с а и о б ъ е к т а

 

Ф у н к ц и о н а л ь н у ю ч а с т ь к л а с с о в и о б ъ е к т о в (т. е. м е т о д ы ) м ы о б с у д и л и, т е п е р ь д а в а й т е о з н а к о м и м с я с ч а с т ь ю д а н н ы х. Д а н н ы е, т. е. п о л я, я в л я ю т с я н е ч е м и н ы м, к а к о б ы ч н ы м и п е р е м е н н ы м и, з а к л ю ч ё н н ы м и в п р о с т р а н с т в а х и м ё н к л а с с о в и о б ъ е к т о в. Э т о о з н а ч а е т, ч т о и х и м е н а д е й с т в и т е л ь н ы т о л ь к о в к о н т е к с т е э т и х к л а с с о в и л и о б ъ е к т о в. О т с ю д а и н а з в а н и е «п р о с т р а н с т в о и м ё н ».

 

С у щ е с т в у е т д в а т и п а п о л е й : п е р е м е н н ы е к л а с с а и п е р е м е н н ы е о б ъ е к т а, к о т о р ы е р а з л и -ч а ю т с я в з а в и с и м о с т и о т т о г о, п р и н а д л е ж и т л и п е р е м е н н а я к л а с с у и л и о б ъ е к т у с о о т в е т -с т в е н н о.

 

П е р е м е н н ы е к л а с с а р а з д е л я е м ы –д о с т у п к н и м м о г у т п о л у ч а т ь в с е э к з е м п л я р ы э т о г о к л а с -с а. П е р е м е н н а я к л а с с а с у щ е с т в у е т т о л ь к о о д н а, п о э т о м у к о г д а л ю б о й и з о б ъ е к т о в и з м е -н я е т п е р е м е н н у ю к л а с с а, э т о и з м е н е н и е о т р а з и т с я и в о в с е х о с т а л ь н ы х э к з е м п л я р а х т о г о

 

104                                 Г л а в а 14. О б ъ е к т н о -о р и е н т и р о в а н н о е п р о г р а м м и р о в а н и е


A Byte of Python (Russian), В е р с и я 2. 01

 

 

ж е к л а с с а.

 

П е р е м е н н ы е о б ъ е к т а п р и н а д л е ж а т к а ж д о м у о т д е л ь н о м у э к з е м п л я р у к л а с с а. В э т о м с л у ч а е

 

к а ж д о г о о б ъ е к т а е с т ь с в о я с о б с т в е н н а я к о п и я п о л я, т. е. н е р а з д е л я е м а я и н и к о и м о б р а -з о м н е с в я з а н н а я с д р у г и м и т а к и м и ж е п о л я м и в д р у г и х э к з е м п л я р а х. Э т о л е г к о п о н я т ь н а п р и м е р е (с о х р а н и т е к а к objvar. py):

 

class Robot:

 

'''П р е д с т а в л я е т р о б о т а с и м е н е м. '''

 

П е р е м е н н а я к л а с с а, с о д е р ж а щ а я к о л и ч е с т в о р о б о т о в

 

population = 0

 

def __init__(self, name):

 

'''И н и ц и а л и з а ц и я д а н н ы х. '''

 

self. name = name

 

print ('(И н и ц и а л и з а ц и я {0})'. format(self. name))

 

П р и с о з д а н и и э т о й л и ч н о с т и, р о б о т д о б а в л я е т с я

к п е р е м е н н о й 'population'

 

Robot. population += 1

 

def __del__(self):

 

'''Я у м и р а ю. '''

 

print ('{0}у н и ч т о ж а е т с я! '. format(self. name))

 

Robot. population -= 1

 

if Robot. population==0:

 

print ('{0}б ы л п о с л е д н и м. '. format(self. name))

 

else:

 

print ('О с т а л о с ь {0: d}р а б о т а ю щ и х р о б о т о в. '. format(Robot. population))

 

def sayHi(self):

 

'''П р и в е т с т в и е р о б о т а.

 

Д а, о н и э т о м о г у т. '''

 

print ('П р и в е т с т в у ю! М о и х о з я е в а н а з ы в а ю т м е н я {0}. '. format(self. name))

 

def howMany():

 

'''В ы в о д и т ч и с л е н н о с т ь р о б о т о в. '''

 

print ('У н а с {0: d}р о б о т о в. '. format(Robot. population))

 

howMany = staticmethod(howMany)

 

droid1 = Robot('R2-D2')

 

droid1. sayHi()

 

Robot. howMany()


 

14. 5. П е р е м е н н ы е к л а с с а и о б ъ е к т а                                                                                                         105


A Byte of Python (Russian), В е р с и я 2. 01

 

droid2 = Robot('C-3PO')

 

droid2. sayHi()

 

Robot. howMany()

 

print (" \n З д е с ь р о б о т ы м о г у т п р о д е л а т ь к а к у ю -т о р а б о т у. \n " )

 

print (" Р о б о т ы з а к о н ч и л и с в о ю р а б о т у. Д а в а й т е у н и ч т о ж и м и х. " )

 

del droid1

 

del droid2

 

Robot. howMany()

 

В ы в о д:

 

python3 objvar. py

 

(И н и ц и а л и з а ц и я R2-D2)

 

П р и в е т с т в у ю! М о и х о з я е в а н а з ы в а ю т м е н я R2-D2.

 

У н а с 1 р о б о т о в.

 

(И н и ц и а л и з а ц и я C-3PO)

 

П р и в е т с т в у ю! М о и х о з я е в а н а з ы в а ю т м е н я C-3PO.

 

У н а с 2 р о б о т о в.

 

З д е с ь р о б о т ы м о г у т п р о д е л а т ь к а к у ю -т о р а б о т у.

 

Р о б о т ы з а к о н ч и л и с в о ю р а б о т у. Д а в а й т е у н и ч т о ж и м и х.

 

R2-D2 у н и ч т о ж а е т с я!

 

О с т а л о с ь 1 р а б о т а ю щ и х р о б о т о в.

 

C-3PO у н и ч т о ж а е т с я!

 

C-3PO б ы л п о с л е д н и м.

 

У н а с 0 р о б о т о в.

 

К а к э т о р а б о т а е т:

 

Э т о д л и н н ы й п р и м е р, н о о н п о м о г а е т п р о д е м о н с т р и р о в а т ь п р и р о д у п е р е м е н -н ы х к л а с с а и о б ъ е к т а. З д е с ь population п р и н а д л е ж и т к л а с с у Robot, и п о э т о -м у я в л я е т с я п е р е м е н н о й к л а с с а. П е р е м е н н а я name п р и н а д л е ж и т о б ъ е к т у (е й п р и с в а и в а е т с я з н а ч е н и е п р и п о м о щ и self), и п о э т о м у я в л я е т с я п е р е м е н н о й о б ъ е к т а.

 

Т а к и м о б р а з о м, м ы о б р а щ а е м с я к п е р е м е н н о й к л а с с а population к а к Robot. population, а н е self. population. К п е р е м е н н о й ж е о б ъ е к т а name в о в с е х м е т о д а х э т о г о о б ъ е к т а м ы о б р а щ а е м с я п р и п о м о щ и о б о з н а ч е н и я self. name. П о м н и т е о б э т о й п р о с т о й р а з н и ц е м е ж д у п е р е м е н н ы м и к л а с с а и о б ъ е к т а. Т а к ж е и м е й т е в в и д у, ч т о п е р е м е н н а я о б ъ е к т а с т е м ж е и м е н е м, ч т о и п е р е м е н н а я к л а с с а, с д е л а е т н е д о с т у п н о й («с п р я ч е т ») п е р е м е н н у ю к л а с с а!

 

М е т о д howMany п р и н а д л е ж и т к л а с с у, а н е о б ъ е к т у. Э т о о з н а ч а е т, ч т о м ы м о -ж е м о п р е д е л и т ь е г о к а к classmethod и л и staticmethod, в з а в и с и м о с т и о т т о г о, н у ж н о л и н а м з н а т ь, в к а к о м к л а с с е м ы н а х о д и м с я. П о с к о л ь к у н а м н е н у ж н а

 

106                                 Г л а в а 14. О б ъ е к т н о -о р и е н т и р о в а н н о е п р о г р а м м и р о в а н и е


A Byte of Python (Russian), В е р с и я 2. 01

 

 

т а к а я и н ф о р м а ц и я, м ы в о с п о л ь з у е м с я staticmethod.

 

М ы м о г л и д о с т и ч ь т о г о ж е с а м о г о, и с п о л ь з у я д е к о р а т о р ы :

 

@staticmethod

 

def howMany():

 

'''В ы в о д и т ч и с л е н н о с т ь р о б о т о в. '''

 

print ('У н а с {0: d}р о б о т о в. '. format(Robot. population))

 

Д е к о р а т о р ы м о ж н о с ч и т а т ь н е к и м у п р о щ ё н н ы м с п о с о б о м в ы з о в а я в н о г о о п е р а т о р а, к а к м ы в и д е л и в э т о м п р и м е р е.



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.