私有屬性與私有方法
應用場景
- 在實際開發中,對象的某些屬性或者方法 可能只希望在對象的內部被使用,而不希望在外部被訪問到;
- 私有屬性 就是對象不希望公開的屬性;
- 私有方法 就是對象不希望公開的方法;
定義方式
在定義屬性或者方法時,在屬性名或者方法名前面增加兩個下划線,定義的就是私有屬性或方法;
沒使用私有屬性前
class Women:
def __init__(self, name, age):
self.name = name
self.age = age
def secret(self):
print("%s 的年齡是 %d" % (self.name, self.age))
xiaohong = Women("小紅", 18)
print(xiaohong.age) # 18
xiaohong.secret() # 小紅 的年齡是 18
使用私有屬性后
class Women:
def __init__(self, name, age):
self.name = name
self.__age = age
def secret(self):
print("%s 的年齡是 %d" % (self.name, self.__age))
xiaohong = Women("小紅", 18)
# 不能在外部直接通過對象調用私有屬性
# print(xiaohong.age) # 報錯 AttributeError: 'Women' object has no attribute 'age'
# 但還是能通過內部方法調用對象的私有屬性
xiaohong.secret() # 小紅 的年齡是 18 公有方法還是能夠調用私有屬性
使用私有方法后
class Women:
def __init__(self, name, age):
self.name = name
self.__age = age
def __secret(self):
print("%s 的年齡是 %d" % (self.name, self.__age))
xiaohong = Women("小紅", 18)
# 當設置私有方法后,外部就不能調用私有方法了
# xiaohong.__secret() # 報錯 AttributeError: 'Women' object has no attribute '__secret'
偽私有屬性和方法
在python中,並沒有真正意義上的私有,只有偽私有;
- python在給私有屬性和私有方法命名時,實際是對名稱做了一些特殊處理,是的外界無法訪問到;
- 處理方式:在名稱前加上 _類名,即 _類名__名稱
破解私有屬性和私有方法
class Women:
def __init__(self, name, age):
self.name = name
self.__age = age
def __secret(self):
print("%s 的年齡是 %d" % (self.name, self.__age))
xiaohong = Women("小紅", 18)
# 當設置私有方法后,外部就不能直接調用私有方法了
# xiaohong.__secret() # 報錯 AttributeError: 'Women' object has no attribute '__secret'
# 破解私有屬性和私有方法,但不建議使用
print(xiaohong._Women__age) # 18
xiaohong._Women__secret() # 小紅 的年齡是 18
但注意,在日常開發中,不要使用這種方式訪問對象的私有屬性或者私有方法!!我們只需要用提供的公共方法來簡介調用私有方法或屬性即可。
父類的私有屬性和方法
- 子類對象不能在自己的方法內部,直接訪問父類的私有屬性和私有方法;
- 子類對象可以通過父類的共有方法,間接訪問到私有屬性和私有方法。
私有屬性,方法,是對象的隱私,不對外公開,外界以及子類,都不能直接訪問;
私有屬性,方法通常用來做一些內部的事情;
子類對象,可以調用父類的公有方法和公有屬性;
而如果父類中的公有方法 有調用父類的私有屬性的話,那么我們也可以通過調用父類的公有方法來間接調用父類的私有屬性和方法。
class Women:
def __init__(self, name, age):
self.name = name
self.__age = age
def __secret(self):
print("私有:%s 的年齡是 %d" % (self.name, self.__age))
def public(self):
print("公有:%s 的年齡是 %d" % (self.name, self.__age))
self.__secret()
class Girl(Women):
def test(self):
print("你的姓名是 %s" % self.name)
# print("你的年齡是 % d" % self.__age) # 不能在子類中直接調用父類的私有屬性
# self.__secret() # 不能在子類中直接調用父類的私有方法
# 可以通過調用父類的公有方法來簡介調用父類的私有屬性和方法
self.public() # 運行結果:(公有:xiaohong 的年齡是 18 私有:xiaohong 的年齡是 18)
print("...")
xiaohong = Girl("xiaohong", 18)
# 子類的對象不能在外部直接調用父類/祖父類的私有屬性和方法
# print(xiaohong.__age)
# print(xiaohong.__secret)
xiaohong.test()
