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