一. 私有属性(封装)
# 侠义 上的封装 面向对象的三大特性之一# 属性 和 方法都隐藏起来 不让你看到# 如果要让内部属性不被外部属性直接访问 在属性前加上两个下划线__# 在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 =heightself.weight =weightself.__money =money # 定义私有属性per =person(300 ,100 ,20000)per.age =1000000000000000000000000print(per.age) # 1000000000000000000000000# print(per.__money) # 在属性前面加上__不能访问内部属性 会报错 所以只要在内部访问per.eat("玻璃")# 如果要让内部属性不被外部属性直接访问 在属性前加上两个下划线__ # 在python中 如果在属性前加上两个下划线那么这个属性就变成了私有属性# 如果你想被外部访问内部属性直接加上 __ 列如这里__money
1. 修改私有属性
class person(object):def __init__(self, height, weight, money):# 定义属性self.height = heightself.weight = weightself.__money = money# 通过内部的方法 修改私有属性# 通过自定义的方法实现对私有属性的赋值和取值def setMoney(self, money):# 数据过滤if money < 0:money = 0self.__money = moneydef getMoney(self):return self.__moneydef 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__= heightself.weight = weightself.__money = money# 通过内部的方法 修改私有属性# 通过自定义的方法实现对私有属性的赋值和取值def setMoney(self, money):# 数据过滤if money < 0:money = 0self.__money = moneydef getMoney(self):return self.__moneydef run(self):print(self.__money) # 内部访问#22222222元print(self.__height__) #300per = person( 300, 100, "22222222元")per.run()# 22222222元per.setMoney(100)per.run() # 100print(per.__height__) # 300
2.私有方法
class Per(object):__key=55555 #静态属性 也可以变成私有属性def __init__(self,name,passwd,age):self.name=nameself.__passwd=passwd# 加上__ 私有属性self.__age=agedef get_pwd(self):print(self.__dict__)print(self.__key,"静态私有属性")return self.__passwd# 只有在类的内部使用私有属性 就会自动的带上 _类命def __agel(self): # 加上__私有方法# print(self.__doc__)print("私有方法!!!!!!")return self.__agedef login(self):#内部调用私有方法 外部取不到self.__agel()aa=Per("张三","123456",'222')print(aa.get_pwd())# {'name': '张三', '_Per__passwd': '123456', '_Per__age': '222'}# 55555 静态私有属性# 123456print(aa.login())# None# 私有方法!!!!!!# None# print(aa._Per__passwd) # 不能这么调用单下划线 '_Per__age# print(aa._Per__age) # 不能这么调用单下划线 '_Per__age# # 123456# # 222aa.login()# 私有方法!!!!!!
class Room(object):def __init__(self,name,length,width):self.name=nameself.__length=lengthself.__width=widthdef area(self):print(self.__width) # 10return self.__length*self.__widthaa=Room("张三",22,10)print(aa.area()) # 220print(aa.__dict__) # {'name': '张三', '_Room__length': 22, '_Room__width': 10}print(aa._Room__width) # 10
# 假设 父类的私有属性 能被 子类 调用吗 答案是 不能的 说明不能被继承class Foo:__key='1223'class Son(Foo):print(Foo.__key)
# 私有方法的使用class Gn(object):bar=11111def __init__(self,name,age):self.name=nameself.age=agedef __aa(self): # 在前面加上 __ 就变成了私有方法 和私有属性一样 只能内部访问 不能外部方法print(f'我叫--{self.name}--今年{self.age}')def __cc(self):print("卧槽11111111111111111111111111111111111111")def fn(self):self.__aa()self.__cc()ss=Gn("王五",666)ss.fn()
# 私有方法的使用
class Gn(object):
bar=11111
def __init__(self,name,age):
self.name=name
self.age=age
def __aa(self,v): # 在前面加上 __ 就变成了私有方法 和私有属性一样 只能内部访问 不能外部方法
print(f'我叫--{self.name}--今年{self.age}',v)
def __cc(self):
print("卧槽11111111111111111111111111111111111111")
def fn(self):
self.__aa("这是私有方法哦")
self.__cc()
ss=Gn("王五",666)
ss.fn()
# 我叫--王五--今年666 这是私有方法哦
# 卧槽11111111111111111111111111111111111111
私有的静态方法@staticmethod
class Gn(object):bar=11111def __init__(self,name,age):self.name=nameself.age=agedef __aa(self,v):print(f'我叫--{self.name}--今年{self.age}',v)@staticmethoddef __fn():print("我是静态私有属性哈哈哈哈哈")def cc(self):Gn.__fn()ss=Gn("王五",666)()# 我是静态私有属性哈哈哈哈哈print("********************************************************88")class Gn(object):bar=11111def __init__(self,name,age):self.name=nameself.age=agedef __aa(self,v):print(f'我叫--{self.name}--今年{self.age}',v)@staticmethoddef __fn():print("我是静态私有属性哈哈哈哈哈")@staticmethoddef stat():Gn.__fn()ss=Gn("王五",666)Gn.stat()# 我是静态私有属性哈哈哈哈哈
私有的类方法@staticmethod
class Gn(object):bar=11111@classmethoddef __aa(cls,name):print(cls.bar)print("我是类方法!!!!!!!!")print(name)def bb(self):Gn.__aa("张三")ss=Gn()ss.bb()# 11111# 我是类方法!!!!!!!!# 张三print("********************************************************")class Gn(object):bar=11111@classmethoddef __aa(cls):print(cls.bar)print("我是类方法!!!!!!!!")@classmethoddef bb(cls):Gn.__aa()ss=Gn()# ss.bb()Gn.bb()## 11111# 我是类方法!!!!!!!!
私有属性方法@property
class Da(object):def aa(self):print("实例化")@propertydef __bb(self):print("私有属性")@propertydef cc(self):c.__bbc=Da()# 私有属性print("******************************************************************8")class Da(object):def aa(self):print("实例化")@propertydef __bb(self):print("私有属性")def cc(self):c.__bbc=Da()()# 私有属性