# 广义上的封装# class 类名:# def 方法名(self):pass# 是为了只有这个类的对象才胡使用定义在类中的方法# 狭义上的封装: 把一个名字藏在类中class Goods: __discount = 0.2 # 私有的静态变量 print(__discount) # 0.2# 在类的外部不能引用私有的静态变量# 类中的静态变量和方法名,在程序加载 的过程 中,已经执行完了,不须要等待调用# 在这个类加载完成 以前,Goods这个类名,还没见有出如今全局名称空间中# 私有的静态变量能够在类的内部使用,用来隐藏某个变量的值。print(Goods.__dict__) # {'__module__': '__main__', '_Goods__discount': 0.2, '__dict__': <attriclass Goods: __discount = 0.7 # 私有的静态变量# 变形: _类名__私有变量# print(Goods.__discount) # AttributeError: type object 'Goods' has no attribute '__discount' 类对象没有这个属性print(Goods._Goods__discount) # 这样能够从类的外部访问,可是从编程规范的角度上出发,不建议在类的外部# 使用私有的静态变量class Student: def __init__(self,name,age): self.__name = name # 对象的私有变量,类外部,不能操做 self.age = age def getName(self): return self.__namestudent = Student("王小宝",28)# print(student.__name) # 报错,对象没有这个属性print(student.getName()) # 王小宝 这是经过类中的方法,来操做对象的私有变量print(student.__dict__) # {'_Student__name': '王小宝', 'age': 28} 对象的属性,是存在对象的名称空间中的,而且对于# 对象的私有变量,也做了一个变形,以对象所属的直接类 _类名__私有变量print(student.age)student.age = "aaaa" # python是弱类型 语言print(student.age)class Goods: __discount = 0.6 # 私有的静态变量 def __init__(self,name,price): self.name = name self.__price = price # 我不想让你看到这个值 def getPrice(self): return self.__price * self.__discount def changePrice(self,newPrice): # 我想让你修改一个值的时候有一些限制 if type(newPrice) is int: self.__price = newPrice else: print("本次价格修改不成功")pear = Goods("pear",89)print(pear.getPrice()) # 53.4pear.changePrice(100) # 将价格改成100print(pear.getPrice()) # 60.0class User: def __init__(self,username,password): self.username = username self.__pwd = password self.pwd = self.__getpwd() def __getpwd(self): return hash(self.__pwd)user = User("chirs",'jiayong')print(user.pwd) # -4615835297725458545# 类中的私有成员# 私有的静态变量# 私有的对象变量# 私有的方法# 私有的变量,在内存中存储时 会 变形,在使用时,也会变形# 为何要定义一 个私有变量呢?# 不想让你看到这个变量# 不想让你修改这个变量# 想让你修改这个变量有一些限制# 有些方法或属性不但愿被子类继承## 广义上的封装,把属性和函数都放到类里# 狭义上的封装,定义 私有成员# 私有变量能不能 在类的外部 定义 ????class A: __private = 1000 print(__private) def getAge(self): print(self.__age)print(A.__dict__) # {'__module__': '__main__', '_A__private': 1000, '__dict__': <attribprint(A._A__private) # 1000A.__language = "chinese"print(A.__dict__)A._A__age = 18 # 经过 这种方式,能够在外部定义一个私有的静态属性print(A.__dict__)print(A._A__age) # 18A.getAge(A) # 18# 私有变量能不能被继承???class A: age = 100 __country = "china" def __init__(self,name): self.__name = name # 存储时 变形 _A__nameclass B(A): # print(age) # NameError: name 'age' is not defined # print(__country) def getName(self): return self.__name # _B__nameb = B("jeason")print(b.__dict__)# b.getName() # AttributeError: 'B' object has no attribute '_B__name'# 结论: 对于 类中的私有变量 ,在那个类中,变量时,就是那个类的名字 和 下划线打头 : _类名__私有变量