zoukankan      html  css  js  c++  java
  • python面向对象三大特性之封装

    一、 概述

    定义:隐藏对象的属性和实现细节,仅对外提供公共访问方式

    封装的原则:把不需要对外提供的内容都隐藏起来,提供公共的方法访问这些隐藏属性

    二、对封装的理解

    • 归类,将类的相关功能函数封装到类里
    • 打包,将一些数据封装到类或者对象中

    使用双下划线将属性和方法隐藏起来

    class Person:
        __role = 'person'  # 定义类的私有属性
        def __init__(self,name,password):
            self.name = name
            self.__password = password  # 定义对象私有属性
        def __getPwd(self): # 定义
    对象的私有方法
    return self.__password def login(self): # 定义公共的方法进行属性房本 password = self.__getPwd() print(password) wangys = Person('wangys','123') print(Person.__dict__) # '_Person__role': 'person', '_Person__getPwd': <function Person.__getPwd at 0x000001D5575AE1E0> # 类的私有静态属性由__属性 变形 _类命__属性,方法也是一样 ##### 类的静态私有属性 ## 使用类调用静态属性 # 通过类直接掉私有属性会报错,报错内容是没有这个私有属性 print(Person.__role) # 结果:AttributeError: type object 'Person' has no attribute '__role' 报错 # 通过调用变形后的私有属性,可以正常调用 print(Person._Person__role) # 结果: person ## 通过对象进行调用静态属性(与类一样) print(wangys.__role) print(wangys._Person__role) # AttributeError: 'Person' object has no attribute '__role' # person ####### 私有属性 print(wangys.__dict__) # {'name': 'wangys', '_Person__password': '123'} # ### 通过对象在外部进行调用私有属性 print(wangys.name) print(wangys.__password) print(wangys._Person__password) # 结果:wangys # 结果: AttributeError: 'Person' object has no attribute '__password' # 结果:123 # 私有属性,在类外部调用时,不能直接调用。 ##### 私有方法 print(wangys.__getPwd) # AttributeError: 'Person' object has no attribute '__getPwd' print(wangys._Person__getPwd) # <bound method Person.__getPwd of <__main__.Person object at 0x000001D4BB8FDA58>> # 外部调用不能直接调用,可以调用变形后的属性 # 使用公共方法访问私有属性 wangys.login() # 123 # 类内部可以直接调用私有属性 # 结论: # 私有属性和方法会变形,类内部可以调用,类外部不能直接调用,可以使用公共的方法调用这些私有属性,通过字典的方式查看,属性并没有被隐藏,但是属性的名称做了变形
    # 类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果
    # 在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。
    # 这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N
    # 变形的过程只在类的内部生效,在定义后的赋值操作,不会变形,也就说不能在类外部定义私有属性
    # 如果父类和子类有同样的方法,子类对象在调用这个方法时,调用的是子类的方法
    class Anmimal:
        def __walk(self):
            print('Animal is walking')
        def test(self):
            self.__walk()
    
    class Person(Anmimal):
        def __walk(self):
            print('Person is walking')
        def test(self):
            self.__walk()
    wangys = Person()
    wangys.test()
    
    
    
    # 如果是私有属性
    class Anmimal:
        def __walk(self):
            print('Animal is walking')
        def test(self):
            self.__walk()
    
    class Person(Anmimal):
        def __walk(self):
            print('Person is walking')
    
    wangys = Person()
    wangys.test()
  • 相关阅读:
    算法
    日常
    算法
    算法
    算法
    算法
    NaviCat连接mysql出现加密方式错误的解决方案:
    Sql sugar的使用
    报表体联查详情页面
    第一次用临时表的感受:
  • 原文地址:https://www.cnblogs.com/wc89/p/10386676.html
Copyright © 2011-2022 走看看