Python class-ները մեզ թույլ են տալիս կազմակերպել կոդը՝ ընդգրկելով համապատասխան տվյալներ և ֆունկցիաներ: Որոշ դեպքերում մենք կարող ենք արգելել class-ից դուրս փոփոխականների օգտագործումը: Python-ը թույլ է տալիս class-ներում ունենալ մասնավոր փոփոխականներ, որոնք կոդի այլ անդամներին արգելում են հասանելիություն ստանալ այդ փոփոխականներին: Մասնավոր փոփոխականները սահմանվում են փոփոխականի անվան սկզբում՝ ունենալով կրկնակի տակի գծիկ (__): Եթե բաց փոփոխականներին կարելի է ուղղակիորեն հասանելիություն ստանալ class-ի դրսից, մասնավոր փոփոխականների դեպքում սա անհնար է: Եկեք դիտարկենք ասվածն օրինակի վրա.
class PublicPrivateExample:
def __init__(self):
self.public_var = 'I am public!' # Public variable
self.__private_var = 'I am private!' # Private variable
example = PublicPrivateExample()
print(example.public_var) # 'I am public!'
print(example.__private_var) # Raises AttributeError
Այս օրինակում մենք կարող ենք տեսնել, որ բաց փոփոխականը հեշտությամբ հասանելի է: Սակայն եթե մենք փորձենք հասանելիություն ստանալ մասնավոր փոփոխականին, Python-ը ցույց կտա՝ AttributeError:
Python-ը չունի խիստ մասնավոր անդամներ, ինչպես մյուս լեզուները (օրինակ՝ Java-ն կամ C++-ը): Python-ում մասնավոր անդամը պարզապես կոնվենցիա է, որը թույլ չի տալիս ուղղակի հասանելիություն ստանալ անդամին: Python-ն օգտագործում է անունների փոփոխություն (name mangling), որպեսզի նվազեցնի մասնավոր փոփոխականին պատահական հասանելիություն ստանալու կամ այն փոփոխելու հավանականությունը: Անհրաժեշտության դեպքում դուք կարող եք հասանելիություն ստանալ դրան, թեև դա չի խրախուսվում:
print(example._PublicPrivateExample__private_var) # I am private!
Մասնավոր փոփոխականին հասանելիություն ստանալն իրականացվում է _ClassName__private_var-ի միջոցով: Սա կանխում է անմիջական մուտքը և օգնում է փոփոխականի փակվելուն: Դուք պետք է կիրառեք բաց մեթոդներ, եթե ցանկանում եք հասանելիություն ստանալ մասնավոր փոփոխականներին.
class PublicPrivateExample:
def __init__(self):
self.__private_var = 'I am private!'
def get_private_var(self): # Getter method for private variable
return self.__private_var # We can access private fields inside the class
example = PublicPrivateExample()
print(example.get_private_var()) # Will print 'I am private!'
Այստեղ մենք կիրառում ենք get_private_var բաց մեթոդը՝ մեր մասնավոր փոփոխականին հասանելիություն ստանալու համար (ընդ որում, սա անելով վերահսկելի ձևով): Այս կերպ մենք պահպանում ենք մեր տվյալների փակվածությունը (ինկապսուլյացիան) և ապահովում ենք դրանց ամբողջականությունը:
💭
Հիշե՛ք, որ մասնավոր փոփոխականների կիրառումը ինկապսուլյացիայի պրակտիկայի մի մասն է, որը օբյեկտների վրա հիմնված ծրագրավորման հիմունքներից մեկն է: Այն պաշտպանում է տվյալները փոփոխվելուց և անսպասելի հասանելիությունից:
Այսպիսով, չնայած Python-ը խստորեն չի կիրառում մասնավոր փոփոխականները, խորհուրդ է տրվում դրանք օգտագործել՝ ձեր կոդը ավելի ապահով դարձնելու և սխալներից զերծ պահելու համար:
Առաջադրանք․ database class
Ձեզ հանձնարարված է Python-ում մշակել Database class, որը կպահի name: value զույգեր: Տվյալների բազան պետք է ներկայացվի որպես մասնավոր բառարան Database class-ի ներսում:
Database class-ը պետք է ունենա հետևյալ մեթոդները.
insert(name, value) - Այս մեթոդը տվյալների բազայում պետք է ավելացնի նոր name: value զույգ: Եթե անունը (name) արդեն գոյություն ունի տվյալների բազայում, այն պետք է տպի հետևյալ հաղորդագրությունը՝ Name already exists in the database.։
delete(name) - Այս մեթոդը պետք է տվյալների բազայից ջնջի գոյություն ունեցող name: value զույգը: Եթե անունը (name) գոյություն չունի, այն պետք է տպի հետևյալ հաղորդագրությունը. Name does not exist in the database.։
update(name, value) - Այս մեթոդը պետք է տվյալների բազայում թարմացնի գոյություն ունեցող name-ի արժեքը (value): Եթե անունը (name) գոյություն չունի, այն պետք է տպի հետևյալ հաղորդագրությունը՝ Name does not exist in the database.։
display() - Այս մեթոդը պետք է տպի տվյալների բազայի բոլոր name: value զույգերը՝ name: value ֆորմատով: Բոլոր արժեքները պետք է բաժանվեն ստորակետով և բացատով (, ):