1. 程式人生 > >面向對象 繼承 派生

面向對象 繼承 派生

python2 類的屬性 編程 依賴 int 執行 拆分 重用 +=

函數體代碼只在調用時執行 ,一但調用產生作用域,存放函數變量

對象:特征與技能的結合體 類:一系列對象相似特征與相似技能的結合體

類:相似特征與技能的結合體

類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__)

技術分享圖片


面向對象 繼承 派生