一. 私有属性(封装)
# 侠义 上的封装 面向对象的三大特性之一 # 属性 和 方法都隐藏起来 不让你看到 # 如果要让内部属性不被外部属性直接访问 在属性前加上两个下划线__ # 在python中 如果在属性前加上两个下划线那么这个属性就变成了私有属性 # print(per.__money) #在属性前面加上__不能访问内部属性
class person(object): def eat(self ,food): print("eat-- " +food) print(self.__money) # 在内部打印私有属性 def __init__(self,height ,weight ,money): # 定义属性 self.height =height self.weight =weight self.__money =money # 定义私有属性 per =person(300 ,100 ,20000) per.age =1000000000000000000000000 print(per.age) # 1000000000000000000000000 # print(per.__money) # 在属性前面加上__不能访问内部属性 会报错 所以只要在内部访问 per.eat("玻璃") # 如果要让内部属性不被外部属性直接访问 在属性前加上两个下划线__ # 在python中 如果在属性前加上两个下划线那么这个属性就变成了私有属性 # 如果你想被外部访问内部属性直接加上 __ 列如这里__money
1. 修改私有属性
class person(object): def __init__(self, height, weight, money): # 定义属性 self.height = height self.weight = weight self.__money = money # 通过内部的方法 修改私有属性 # 通过自定义的方法实现对私有属性的赋值和取值 def setMoney(self, money): # 数据过滤 if money < 0: money = 0 self.__money = money def getMoney(self): return self.__money def run(self): print(self.__money) # 内部访问 #22222222元 per = person( 300, 100, "22222222元") per.run()# 22222222元 per.setMoney(100) per.run() # 100
# 在python中 __xxx__属于特殊变量 可以直接访问的 class person(object): def __init__(self, height, weight, money): # 定义属性 self.__height__= height self.weight = weight self.__money = money # 通过内部的方法 修改私有属性 # 通过自定义的方法实现对私有属性的赋值和取值 def setMoney(self, money): # 数据过滤 if money < 0: money = 0 self.__money = money def getMoney(self): return self.__money def run(self): print(self.__money) # 内部访问 #22222222元 print(self.__height__) #300 per = person( 300, 100, "22222222元") per.run()# 22222222元 per.setMoney(100) per.run() # 100 print(per.__height__) # 300
2.私有方法
class Per(object): __key=55555 #静态属性 也可以变成私有属性 def __init__(self,name,passwd,age): self.name=name self.__passwd=passwd # 加上__ 私有属性 self.__age=age def get_pwd(self): print(self.__dict__) print(self.__key,"静态私有属性") return self.__passwd # 只有在类的内部使用私有属性 就会自动的带上 _类命 def __agel(self): # 加上__私有方法 # print(self.__doc__) print("私有方法!!!!!!") return self.__age def login(self): #内部调用私有方法 外部取不到 self.__agel() aa=Per("张三","123456",'222') print(aa.get_pwd()) # {'name': '张三', '_Per__passwd': '123456', '_Per__age': '222'} # 55555 静态私有属性 # 123456 print(aa.login()) # None # 私有方法!!!!!! # None # print(aa._Per__passwd) # 不能这么调用 单下划线 '_Per__age # print(aa._Per__age) # 不能这么调用 单下划线 '_Per__age # # 123456 # # 222 aa.login() # 私有方法!!!!!!
class Room(object): def __init__(self,name,length,width): self.name=name self.__length=length self.__width=width def area(self): print(self.__width) # 10 return self.__length*self.__width aa=Room("张三",22,10) print(aa.area()) # 220 print(aa.__dict__) # {'name': '张三', '_Room__length': 22, '_Room__width': 10} print(aa._Room__width) # 10
# 假设 父类的私有属性 能被 子类 调用吗 答案是 不能的 说明不能被继承 class Foo: __key='1223' class Son(Foo): print(Foo.__key)