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()

猜你喜欢

转载自www.cnblogs.com/wc89/p/10386676.html