關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
關於Python中的私有屬性和私有方法
Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點:
1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public);
2、類內部可以訪問私有屬性(方法);
3、類外部不能直接訪問私有屬性(方法);
4、類外部可以通過 _類名__私有屬性(方法)名
訪問私有屬性(方法)
定義私有屬性/方法
class Demo:
__price = 25.8
def __init__(self, u_name, u_age):
self.uname = u_name
self.__uage = u_age
def __age(self):
print("這是私有方法")
print("調用共有屬性:", self.uname)
print("調用私有屬性:", self.__uage)
print("調用私有類屬性:", self.__price)
def name(self):
print("這是公有方法")
print("調用共有屬性:", self.uname)
print("調用私有屬性:", self.__uage)
print("調用私有類屬性:", self.__price)
使用 dir()函數可以查看對象內的所有的屬性和方法
在 python 中任何東西都是對象,一種數據類型,一個模塊等,都有子集的屬性和方法,除了常用的方法外,其他的你不需要全部記住它,交給 dir() 函數就好了。
d = Demo('Tom', 18)
print(dir(d))
"""
['_Demo__age', '_Demo__price', '_Demo__uage', '__class__', '__delattr__', '__dict__',
'__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
'__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__', 'name', 'uname']
"""
這些列印出來的屬性(方法)是可以直接調用的。從列印的結果可以看到,私有屬性 __age()
、 __price
、__uage
這三個私有屬性(方法)都變成了 _Demo__age
, _Demo__price
, _Demo__uage
,也就可以看出,私有屬性(方法)在Python中是不允許直接去調用的,類外部可以通過 ”_類名__私有屬性(方法)名“ 訪問私有屬性(方法)
調用屬性(方法)
# 調用共有方法
d.name
"""
這是公有方法
調用共有屬性: Tom
調用私有屬性: 18
調用私有類屬性: 25.8
"""
#學習中遇到問題沒人解答?小編創建了一個Python學習交流群:153708845
# 調用私有方法(錯誤示範)
d.__age()
"""
Traceback (most recent call last):
File "D:/Local/PycharmProjects/private_obj/demo.py", line 32, in <module>
d.__age()
AttributeError: 'Demo' object has no attribute '__age'
"""
# 調用私有方法(正確示例)
d._Demo__age()
d._Demo__
"""
這是私有方法
調用共有屬性: Tom
調用私有屬性: 18
調用私有類屬性: 25.8
"""
# 調用私有屬性
print(Demo._Demo__price) # 25.8
print(d._Demo__uage) # 18
【註】方法本質上也是屬性!只不過是可以通過()執行而已。