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()) # 在类外部查看类内定义的私有方法

运行结果:

 

posted @ 2018-09-20 18:48  写的BUG代码少  阅读(178)  评论(0编辑  收藏  举报