一. 私有屬性(封裝)
# 俠義 上的封裝 面向對象的三大特性之一 # 屬性 和 方法都隱藏起來 不讓你看到 # 如果要讓內部屬性不被外部屬性直接訪問 在屬性前加上兩個下划線__ # 在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)
# 私有方法的使用 class Gn(object): bar=11111 def __init__(self,name,age): self.name=name self.age=age def __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=11111 def __init__(self,name,age): self.name=name self.age=age def __aa(self,v): print(f'我叫--{self.name}--今年{self.age}',v) @staticmethod def __fn(): print("我是靜態私有屬性哈哈哈哈哈") def cc(self): Gn.__fn() ss=Gn("王五",666) ss.cc() # 我是靜態私有屬性哈哈哈哈哈 print("********************************************************88") 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) @staticmethod def __fn(): print("我是靜態私有屬性哈哈哈哈哈") @staticmethod def stat(): Gn.__fn() ss=Gn("王五",666) Gn.stat() # 我是靜態私有屬性哈哈哈哈哈
私有的類方法@staticmethod
class Gn(object): bar=11111 @classmethod def __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 @classmethod def __aa(cls): print(cls.bar) print("我是類方法!!!!!!!!") @classmethod def bb(cls): Gn.__aa() ss=Gn() # ss.bb() Gn.bb() # # 11111 # 我是類方法!!!!!!!!
私有屬性方法@property
class Da(object): def aa(self): print("實例化") @property def __bb(self): print("私有屬性") @property def cc(self): c.__bb c=Da() c.cc # 私有屬性 print("******************************************************************8") class Da(object): def aa(self): print("實例化") @property def __bb(self): print("私有屬性") def cc(self): c.__bb c=Da() c.cc() # 私有屬性