zoukankan      html  css  js  c++  java
  • python学习笔记 day25 封装

    1. 封装

    广义面向对象的封装是为了代码的保护,只让自己的对象调用自己的方法;

    狭义的封装是把属性,方法隐藏起来,只供内部调用,不让外部调用;

    1. 私有属性--- 在类内部使用__私有属性名 来定义一个私有属性

    class Person():
        def __init__(self,name,password):
            self.name=name  # 定义普通属性
            self.__password=password  # 定义私有属性
    
    person=Person('xuanxuan',123)
    print(person.name)
    try:
        print(person.password)  # 直接在外部调用私有属性是不可以的!
    except Exception as error:
        print("password是私有属性,外部不可以直接调用",error)

    运行结果:

    那到底可不可以有一种方式调用在类内部定义的私有属性呢~其实私有属性在类内部定义时会自动在前面加上_类名,也就是在外部必须使用_类名__私有属性名才可以调用私有属性;

    class Person():
        def __init__(self,name,password):
            self.name=name  # 定义普通属性
            self.__password=password  # 定义私有属性
    
    person=Person('xuanxuan',123)
    print(person.name)
    print(person.__dict__)  # 可以查看此时person对象的变量,包括私有属性__password到底被伪装成了什么形式(_类名__私有变量名)
    print(person._Person__password)  # 在类内部定义的私有属性会被自动转成_类名__私有属性名,所以在类外面调用时,需要注意调用方式

    运行结果:

     在类内部定义的私有属性会在前面自动加上_类名~,但是原则上不建议在类外部使用这种方式(_类名__私有变量名)去调用类内定义的私有属性私有属性只有在类内定义才有效

     2. 私有方法:

    class Person():
        def __init__(self,name,password):
            self.name=name
            self.__password=password # 定义私有属性
    
        def __getpassword(self):  # 定义私有方法
            return self.__password
    
    
    person=Person('xuanxuan',123)
    print(person._Person__password)  # 在外部可以通过_类名__私有属性名来查看私有属性(但是不建议这么做)
    print(person._Person__getpassword()) # 在内部定义的私有方法其实也被自动转成_类名__私有方法名,所以可以通过这种方式调用类内的私有方法(不建议这么做)
    print(Person.__dict__) # 可以查看Person类中的所有变量(普通属性,私有属性,私有方法,普通方法)

    运行结果:

    发现其实类内定义的私有方法,也会被自动在前面加上_类名,所以在外部可以使用_类名__私有方法名来调用类内的私有方法(也不建议)

    3. 静态私有属性

    class Person():
        __key='对密码的编码方式' # 静态私有属性,比如说要对用户的密码以某种方式编码(但又不希望外部看见,虽然外部也可以使用某种方式看见)
        def __init__(self,name,password):
            self.name=name
            self.__password=password # 定义私有属性 外部可以使用_类名__私有属性名进行调用,当然对属性的调用前面肯定要加实例化的对象名 对象名._类名__私有属性名
        def __getpassword(self): # 定义私有方法
            return self.__password  # 可以在私有方法中调用私有属性
        def func(self):
            self.__getpassword()  # 注意虽然私有属性或者私有方法都是在前面加上__双下划线,但是它们又会在类内被自动加上_类名;
                                  # 但是别忘了调用方法或属性都是对象在调用,前面必须要加上对象名啊~
    
    person=Person('璇璇',123)
    print('调用类内的静态私有属性:',person._Person__key) # 在类外部查看类内定义的静态私有属性
    print('调用类内定义的私有属性:',person._Person__password) # 在类外部调用类内定义的私有属性
    print('调用类内定义的私有方法:',person._Person__getpassword()) # 在类外部查看类内定义的私有方法

    运行结果:

    talk is cheap,show me the code
  • 相关阅读:
    angular2 如何使用animate实现动画效果
    angular2+ 组件中用@import进来的css不起作用
    ReentrantLock & AQS
    常用JDK命令
    分布式缓存
    持续交付
    持续部署
    持续集成
    领域驱动设计简介
    spring boot 整合JPA bean注入失败
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9682653.html
Copyright © 2011-2022 走看看