導讀: 1.私有成員 2.@property 3.訪問對象信息 1. 私有成員 在某些情況下,我們希望限制用戶訪問對象的屬性或方法,也就是希望它是私有的,對外隱蔽。 那麼,如何在類中定義私有屬性或私有方法呢: 在屬性名或方法名前加上兩個下劃線__,使其不能在類的外部使用。 1.類的私有屬性 和 私有 ...
導讀:
1.私有成員
2.@property
3.訪問對象信息
1. 私有成員
在某些情況下,我們希望限制用戶訪問對象的屬性或方法,也就是希望它是私有的,對外隱蔽。
那麼,如何在類中定義私有屬性或私有方法呢: 在屬性名或方法名前加上兩個下劃線__,使其不能在類的外部使用。
1.類的私有屬性 和 私有方法,都不能通過對象直接訪問,但是可以在本類內部通過self訪問;
2.類的私有屬性 和 私有方法,都不會被子類繼承,子類也無法訪問;
3.私有屬性 和 私有方法 往往用來處理類的內部事情,不通過對象處理,避免數據在類的外部被修改,起到安全作用。
4. _x 單前置下劃線,私有化屬性或方法,在使用from xxx import *時都不會被導入,類對象和子類可以訪問,但不要隨便訪問。_類名__x可以訪問。
示例:
class A:
__str = 'python'
def __init__(self):
self.__cook = "fire"
def __f(self):
return self.__str
def f(self):
return self.__str
a = A()
a.__str # 'A' object has no attribute '__str'
a.__f() # 'A' object has no attribute '__f'
a.f() # 輸出: python
修改對象屬性值
如果需要修改一個對象的屬性值,通常有2種方法:
- 對象名.屬性名 = 數據 ----> 直接修改
- 對象名.方法名() ----> 間接修改
私有屬性不能直接訪問,所以無法通過第一種方式修改,一般通過第二種方式修改私有屬性的值:定義一個可以調用的公有方法,在這個公有方法內訪問修改。
獲取和修改私有屬性
現代軟體開發中,通常會定義get_xxx()方法和set_xxx()方法來獲取和修改私有屬性值。
# 返回私有屬性的值
def get_xxx(self):
return self.__xxx
# 接收參數,修改私有屬性的值
def set_xxx(self, num):
self.__xxx = num
# 可以通過訪問公有方法set_xxx()來修改私有屬性的值
對象.set_xxx(100)
# 可以通過訪問公有方法get_xxx()來獲取私有屬性的值
print(對象.get_xxx())
2. @property
要調用那些私有屬性怎麼辦?
可以使用property函數。 請看下麵的例子:
__metaclass__ = type
class ProtectMe:
def __init__(self):
self.me = "xiao"
self.__name = "kivi"
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
if len(name) > 10:
print("name的長度太長了")
self.__name = value
if __name__ == "__main__":
p = ProtectMe()
print(p.name) # kivi
p.name = "salmond"
print(p.name) # salmond
運行結果:
kivi
salmond
從上面可以看出, 用了@property之後, 再調用那個方法的時候, 用p.name的形式,就好像在調用以往非私有化屬性一樣。
把一個 getter 方法變成屬性,只需要加上@property 就可以了,此時,@property 本身又創建了另一個裝飾器@score.setter,負責把一個 setter 方法變成屬性賦值,於是,我們就擁有一個可控的屬性操作。至於裝飾器,我們以後再講。
3. 獲取對象信息
type(obj)
使用 type(obj) 來獲取對象的相應類型
>>> dog1 = Animal ( ’ dog1 ’ ) >>> type ( dog1 ) __main__. Animal
isinstance(obj, type)
使用 isinstance(obj, type) 判斷實例對象是否為指定的 type 類型的實例(類 classname 或其子類的實例)即`object._class `是 class_name 或其子類時返回 True。
>>> isinstance(object, class_name)
True
issubclass(class1, class2)
issubclass(class1, class2) :用於檢查類 class1 是不是 class2 的子類。例如 issubclass(bool, int) 會返回 True,因為 bool 是 int 的子類。
hasattr/getattr/setattr
- 使用 hasattr(obj, attr) 判斷對象是否具有指定屬性/方法;
- 使用 getattr(obj, attr[, default]) 獲取屬性/方法的值, 要是沒有對應的屬性則返回 default 值(前提是設置了 default),否則會拋出 AttributeError 異常;
- 使用 setattr(obj, attr, value) 設定該屬性/方法的值,類似於 obj.attr=value。
dir(obj)
獲取對象所有屬性和方法名的列表。