私有屬性
類里面定義的變量叫做屬性。而類屬性有兩種:共有屬性和私有屬性
私有屬性的定義
單下劃線開頭:_attr (外部可訪問)
雙下劃線開頭:__attr(外部無法訪問)Python中對屬性的私有化,只是通過修改這個屬性的名稱來實現的。所以Python并沒有真正的私有化支持,但可以使用下劃線得到私有化。
有一個大多數Python代碼都遵循的原則:帶有下劃線前綴的名稱,應該被視為非公開的API的一部分(無論數據、函數、方法)。它應該被視為實現細節,如果它有所更改,不需要另行通知。也就是說,不要去訪問私有的數據
代碼演示
class TestClass(object):
attr = 0
_attr = 100
__attr = 200 # 外部無法訪問,因為被修改了名稱,修改為:_TestClass__attr
# 訪問類屬性無需實例化,直接用類名進行訪問
print(TestClass.attr) # 0 外部可以訪問
print(TestClass._attr) # 100 外部可以訪問
# print(TestClass.__attr) # 報錯,外部無法訪問
print(TestClass._TestClass__attr) # 200, 使用修改后的屬性名稱,可訪問得到。
__dict__
- 作用
1.類直接調用object.__dict__
:返回該類的屬性和方法的字典
2.實例調用object().__dict__
:返回實例相關的屬性和方法 - 代碼演示
class Hero(object):
"""
我是類注釋
"""
id = 123
def hero(self):
"""
我是方法注釋
"""
pass
print(Hero.__dict__) # 類調用__dict__
'''
{
{'__module__': '__main__',
'__doc__': '\n 我是類注釋\n ',
'id': 123,
'hero': <function Hero.hero at 0x000000000280D950>,
'__dict__': <attribute '__dict__' of 'Hero' objects>,
'__weakref__': <attribute '__weakref__' of 'Hero' objects>}
}
'''
h = Hero()
h.name = 'Hero'
print(h.__dict__) # {'name': 'Hero'}
__doc__
作用
1.類調用:打印類的注釋
2.方法調用:打印方法的注釋使用方式(沿用上面例子的類)
print(Hero.__doc__) # 我是類注釋
print(h.__doc__) # 我是類注釋
print(Hero.hero.__doc__) # 我是方法注釋
print(h.hero.__doc__) # 我是方法注釋
self和cls的區別
- self:實例對象本身
- cls:類對象本身
class Hero1(object):
def func(self):
print('self=>', self) # self=> <__main__.Hero1 object at 0x00000000022AB0B8>
@classmethod
def func1(cls):
print('cls=>', cls) # cls=> <class '__main__.Hero1'>
h1 = Hero1()
h1.func()
h1.func1()
self和cls的區別.png