Մասնավոր փոփոխականներ class-ներում

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-ը պետք է ունենա հետևյալ մեթոդները.
  1. insert(name, value) - Այս մեթոդը տվյալների բազայում պետք է ավելացնի նոր name: value զույգ: Եթե անունը (name) արդեն գոյություն ունի տվյալների բազայում, այն պետք է տպի հետևյալ հաղորդագրությունը՝ Name already exists in the database.։
  1. delete(name) - Այս մեթոդը պետք է տվյալների բազայից ջնջի գոյություն ունեցող name: value զույգը: Եթե անունը (name) գոյություն չունի, այն պետք է տպի հետևյալ հաղորդագրությունը. Name does not exist in the database.։
  1. update(name, value) - Այս մեթոդը պետք է տվյալների բազայում թարմացնի գոյություն ունեցող name-ի արժեքը (value): Եթե անունը (name) գոյություն չունի, այն պետք է տպի հետևյալ հաղորդագրությունը՝ Name does not exist in the database.։
  1. display() - Այս մեթոդը պետք է տպի տվյալների բազայի բոլոր name: value զույգերը՝ name: value ֆորմատով: Բոլոր արժեքները պետք է բաժանվեն ստորակետով և բացատով (, ):
Մուտք
Ելք
db = Database(); db.insert('Bob', 23); db.insert('Alice', 25); db.update('Bob', 24); db.display(); db.delete('Alice'); db.display();
Bob: 24, Alice: 25 Bob: 24
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue