面向對象 繼承 派生
函數體代碼只在調用時執行 ,一但調用產生作用域,存放函數變量
對象:特征與技能的結合體 類:一系列對象相似特征與相似技能的結合體
類:相似特征與技能的結合體
類class 類名首字母大寫,類在定義階段內部代碼就會執行,產生名稱空間(類名.__dict__:各屬性名值對的字典),內部定義的變量:數據屬性 類內部定義的函數:函數屬性
class.屬性名來訪問屬性
class.新屬性名 = ‘**‘增加了一個屬性
del class.屬性名 刪除屬性 stu1.屬性名=‘’更改一個屬性
類名()實例化得到一個對象
__init__為對象定制對象自己獨有的特征
加上init後實例化的步驟:產生一個空對象stu1;觸發類.__init__(stu1,參數) 對象stu1是個名稱空間,stu1.__dict__能夠查看stu1的名稱空間字典
對象stu1的增刪改查與class的一樣
類的數據屬性是所有對象共有的,指向了同一個內存地址
類的函數屬性是綁定給對象的,綁定到不同的對象是不同的綁定方法,綁定到的內存地址是不一樣的,對象調用綁定方法時默認把對象本身當做第一個參數self傳入
- 站的角度不同,定義出的類是截然不同的;
- 現實中的類並不完全等於程序中的類,比如現實中的公司類,在程序中有時需要拆分成部門類,業務類等;
- 有時為了編程需求,程序中也可能會定義現實中不存在的類,比如策略類,現實中並不存在,但是在程序中卻是一個很常見的類。
python中一切皆對象,在python3中統一了類與類型的概念(定義數字 int()類產生一個數字對象)
使用類可以:將數據與專門操作該數據的功能整合到一起
定義學生類,並計算產生了多少個學生對象:
class Student():
school = "luffycity" #共同屬性 數據屬性
c = 0
def __init__(self,name,age,sex): #定義對象獨有屬性
self.name = name
self.age = age
self.sex = sex
# self.c += 1 # 去類裏找 但是只每個對象獨有的 互不影響 也沒有更改類的c值
Student.c += 1 #更改了共有屬性
def learn(self): #函數屬性
print(‘%s is learning‘%(self.name))
stu1 = Student(‘a‘,22,‘f‘)
stu2 = Student(‘b‘,21,‘m‘) #實例化對象 stu1 stu2
print(stu1.__dict__)
print(stu2.__dict__) #打印出對象stu1 stu2的命名空間 {‘name‘: ‘b‘, ‘age‘: 21, ‘sex‘: ‘m‘} 私有屬性
print(Student.c) #類的屬性 共有
print(stu1.c)
print(stu2.c) # 共有屬性需要用對象去掉用查看
print(stu1.school)
print(stu2.school)
stu1.learn()
stu2.learn() #共有函數屬性
Student.learn(stu1) # = stu1.learn 對象調用時默認把自己當做self參數傳進去
繼承:class1.__bases__查看class1有哪些父類
對象查找屬性:找自己- 找類-找父類-找父類的父類。。。不去全局找
類與類之間 什麽是什麽 的關系
派生:
當子類中派生出自己的屬性時以優先以自己的屬性、所在的類為主
屬性查找方式:對象最先,對象本身沒有時子類會先於父類被檢查;
多個父類會根據它們在列表中的順序被檢查;
如果對下一個類存在兩個合法的選擇,選擇第一個父類
python2:新式類:繼承object的類以及他的子類
經典類:沒有繼承object的類以及他的子類 查找屬性順序:深度優先
python3:新式類 python3沒有繼承的類默認都繼承object類 查找屬性順序:廣度優先 按照__mro__列表的順序查找
經典類:
新式類:
在子類派生出新方法中重用父類的方法:
1:指名道姓 父類名.方法名() 不依賴繼承
2:super(自己類名,self).父類方法名 依賴於繼承關系 super(自己類名,self)得到特殊的對象 可以調用父類屬性,對象綁定方法時對象會默認把自己傳到第一個參數self
super(Garen,self).attack(enemy) python3中可以直接用super().父類方法
super依照子類的__mro__列表去查找父類屬性 參照的是基於子類的mro列表
class A:
def f1(self):
print("from A")
super(A,self).f1() # 雖然A沒有父類 但程序基於的是類C的mro列表(C,A,B,object)去查找,所以A裏調用super其實調用的是類B
class B:
def f1(self):
print("from B")
class C(A,B):
pass
c = C()
c.f1()
print(C.__mro__)
面向對象 繼承 派生