一、 類方法、實例方法、靜態方法、私有屬性
1. 類方法
定義:使用裝飾器@classmethod
。第一個參數必須是當前類對象,該參數名一般約定爲“cls
”,通過它來傳遞類的屬性和方法(不能傳實例的屬性和方法)
調用:實例對象和類對象都可以調用
應用場景:需要站在類的角度執行某個行爲時,那麼就應該定義爲類方法
2. 實例方法
調用:只能由實例對象調用
3. 靜態方法
定義:使用裝飾器@staticmethod
。參數隨意,沒有“self
”和“cls
”參數,但是方法中不能使用類或實例的任何屬性和方法
調用:實例對象和類對象都可以調用
應用場景:存放邏輯代碼,內部不需要引用類屬性和實例屬性
4. 私有屬性
單下劃線開頭:_attr
雙下劃線開頭:__attr
聲明爲私有屬性:聲明爲私有屬性,那麼該說明屬性是類私有的,僅限於在類裏面使用,不要在類外面去調用(實際上類外面可以訪問)
二、 類的繼承關係
1. 什麼是繼承,繼承有什麼用?
面向對象編程中有一個重要的思想叫做繼承,子類通過繼承可以獲得父類的屬性和方法,被繼承的類叫做父類(基類),繼承的類叫做子類。
作用:子類通過繼承可以獲得父類的屬性和方法,提高開發的效率和代碼的複用率。
- 類屬性可以直接繼承
- 實例方法通過繼承可以得到
- 實例屬性是實例對象所獨有的,不能繼承(在創建實例對象的時候賦值)
class MyClass:
# 類屬性
attr = 100
def __init__(self, name, age):
# 實例屬性
self.name = name
self.age = age
# 實例方法
def func1(self):
print('實例方法1')
# 類方法
@classmethod
def c_func(cls):
print('類方法c_func')
2.調用重名的父類方法
重寫父類的方法:父類有一個方法,繼承之後又定義了一個和父類方法名相同的方法;直接調用自身重寫之後的方法,不會去父類中找
在方法中調用父類重寫前的方法:
方式一:父類名.方法名(self)
方式二:super().方法名()
__new__
方法:創建並返回一個新的對象
class Obj(object):
pass
o = Obj() # 通過類名創建對象
print(o)
運行結果:
<__main__.Obj object at 0x0022DC90>
3. 屬性動態設置(反射機制)
1). 設置屬性:setattr(object , name , value)
示例:
# 給對象動態設置屬性:參數(對象,屬性名,屬性值)
setattr(case1, 'age', 98) # 等同於case1.age = 98
print(case1.age)
運行結果:
98
示例:
class Cases:
def __init__(self, name):
self.name = name
case1 = Cases('1')
datas = {'case_id': 1, 'data': '999', 'url': 'www.baidu.com'}
for k, v in datas.items():
# print(k, v)
setattr(case1, k, v)
print(case1.url)
運行結果:
www.baidu.com
2).獲取屬性:getattr(object , name , default)
示例:
class Cases:
def __init__(self, name):
self.name = name
case1 = Cases('1')
datas = {'case_id': 1, 'data': '999', 'url': 'www.baidu.com'}
for k, v in datas.items():
print(k, v)
res = getattr(case1, 'name')
print(res)
運行結果:
case_id 1
data 999
url www.baidu.com
1
3).刪除屬性:delattr(object , name)
示例:
class Cases:
def __init__(self, name):
self.name = name
case1 = Cases('1')
datas = {'case_id': 1, 'data': '999', 'url': 'www.baidu.com'}
for k, v in datas.items():
print(k, v)
# setattr(case1, k, v)
# print(case1.url)
# 刪除屬性
delattr(case1, 'name')
# 獲取屬性值
res = getattr(case1, 'name')
print(res)
運行結果:
case_id 1
data 999
url www.baidu.com
Traceback (most recent call last):
File "E:/PycharmProjects/py23_class/py23_11day/zy_11day.py", line 52, in <module>
res = getattr(case1, 'name')
AttributeError: 'Cases' object has no attribute 'name'
在python中,萬物皆對象,包括:
函數:函數對象
基本的數據:init數據類型的對象、列表類型的對象、字符串對象、元組對象、字典對象
類:類對象
類創建出來的對象:實例對象
模塊:模塊對象
包:包對象