zoukankan      html  css  js  c++  java
  • 封装

    封装:就是把属性或方法装起来

      广义:把属性和方法装起来,不让外面直接调用,要通过类的名字或类的对象来调用

      狭义:把属性和方法藏起来,外面根本不能调用,只能在内部偷偷调

    私有属性或方法就是在静态变量、实例属性和成员方法名前加双下划线__,不能被外部被调用,只能在内部使用

    实际上所有的私有化都是为了让用户不在外部调用类中的某个名字

    import hashlib
    class User(object):
        a = 1
        __b = 2  # 实际上 ==> _User__b = 2
    
        def __init__(self, name, pwd):
            self.username= name
            self.__pwd = pwd  # 给一个属性名前加上__就变成了私有属性
    
        def get_pwd(self):
          # 可以自定义一个方法返回self.__pwd的值,表示可以让用户看,不能改
            return self.__get_md5()
        #
        # def change_pwd(self, old_pwd, new_pwd):
        #    # 用户只有通过调用该方法才能修改私有属性
        #     if old_pwd == new_pwd:
        #         self.__pwd = new_pwd
    
        def __get_md5(self):  # ==> _User__get_md5()
            # 不想让外界直接看到__pwd的明文,将其通过md5加密,并将该方法设为私有方法
            md5 = hashlib.md5()
            md5.update(self.username.encode('utf-8'))
            md5.update(self.__pwd.encode('utf-8'))
    
            return md5.hexdigest()
    
    
    alex = User('alex', '123')
    print(alex.get_pwd())
    
    # 1.如果完成私有化,那么这个类的封装度就更高了,各种属性和方法的安全性也越高,但是代码越复杂
    
    # 2.为啥加了双下划线的名字不能从类的外部调用了?
    # print(User.__dict__) # 这里就能看到其实是Python在类的字典中将加了双下划线的属性或方法的名字做了更改
    # 那么如果确实想要调用私有属性或方法通过 类名._类名__私有方法或属性名  就可以调用
    # print(User._User__b)
    
    # 3.私有的内容不能被子类使用
    
    # 4.在其他语言中的数据的级别都有哪些?
        # public:公有的,类的内部外部都能用,父类子类都能用
        # protect:保护的,类内能用,父类子类能用,外部不能用  # python不支持
        # private:私有的,本类的内部能用,其他都不能用
  • 相关阅读:
    poj 1226
    在Excel中创建和使用ServerDocument
    Linux进程管理—信号、定时器
    《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列
    POJ 1054 The Troublesome Frog
    boost库在工作(37)网络UDP服务端之七
    指纹增强程序Hong_enhancement
    读书笔记——Windows核心编程(15)在应用程序中使用虚拟内存
    蓝牙技术谈之调频技术(一)
    android使用全局变量的两种方法
  • 原文地址:https://www.cnblogs.com/GOD-L/p/13537770.html
Copyright © 2011-2022 走看看