day07面向對象進階
類.__init__查看對象的函數屬性
類.__dict__查看類的屬性對象
定義在類內部的變量,是所有對象共有的,id相同
定義在類內部的函數,是綁定在所有對象上,給對象用的obj.func()就會吧obj傳到func(obj)
類內部的方法都是綁定方法,綁定到對象上
綁定方法(類綁定,對象綁定),非綁定方法
面向對象的特性
類與對象
對象是特征(變量)與技能(函數)的結合
類是一系列對象共有的特征和技能
現實中,先有對象,再總結歸納出類,程序中,先定義類再實例化對象
類的第一種用法,實例化
第二種用法,屬性引用
繼承與多態
繼承
“是”的關系,可以用繼承來消除代碼冗余
人是動物,豬是動物,狗是動物
類的括號寫的是被繼承的類
繼承順序,在python2中有經典類和新式類,python3中只有新式類,新式類繼承順序
新式類繼承順序:D->C->B->E->F->G->A
繼承可以是變量可以是方法,對象本身沒有的變量或者方法去父類中找,父類沒有去object中找。
組合
也可以解決代碼容易,是什麽“有”什麽的關系
class teacher:
def __init__(self,name,age,year,mon,day):
self.name = name
self.age = age
self.birth1 =
birth(year,mon,day)
class
def __init__(self,year,mon,day):
self.year = year
self.mon = mon
self.day = day
def tell(self):
print("%s-%s-%s" %(self.year,self.mon,self.day))
t=teacher("dodo",18,1990,8,12)
print(t)#<__main__.teacher object at 0x00000000006C1DA0>
print(t.name)#dodo
print(t.birth1)#<__main__.birth object at 0x00000000006C1DD8>
模擬接口
在類裏面定義需要實現的功能,在實例中實現
class File():
# def read(self):#pass
# #方法一:主動拋異常,讓實例實現read功能
# raise TypeError("類型錯誤")#主動拋異常,只有子類重寫才不會拋異常
# #方法二:強行實現功能,抽象類
抽象類
import abc
class File(metaclass = abc.ABCMeta):
@abc.abstractmethod
def read(self): pass
@abc.abstractmethod
def talk(self):pass
class word(File):
def read(self):
print("read")
def talk(self):
print("talk")
p=word()#
多態
同一種事物的多種形態,類的子類。
多態性:具有不同功能的函數可以使用相同的函數名
如:父類的函數,在子類重寫
封裝
綁定方法和非綁定方法
綁定方法:可以自動傳值
只要在類內部定義,沒有任何修飾,就是對象的綁定方法,把對象當做第一個參數傳入方法
[email protected],把類當做第一個參數傳入方法體
非綁定方法
[email protected],就是一個普通工具
"""
綁定方法和非綁定方法
"""
class Foo:
def test1(self):
pass
@classmethod
def test2(cls):
pass
@staticmethod
def test3():
pass
p = Foo()
print(p.test1)
print(Foo.test2)
print(p.test3)
"""
<bound method Foo.test1 of <__main__.Foo object at
0x0000000000AB1D30>>
<bound method Foo.test2 of <class ‘__main__.Foo‘>>
<function Foo.test3 at 0x0000000000AB3598>
"""
反射
通過字符串的方式尋找類中的屬性
class people:
country = ‘chinese‘
def __init__(self,name,age):
self.name = name
self.age = age
p = people("egon",10)
查詢
# print(hasattr(p,‘name‘))#類中有沒有name屬性
增加
# setattr(p,‘x‘,123)#設置屬性值
# print(p.__dict__)#{‘x‘: 123, ‘age‘: 10, ‘name‘: ‘egon‘}
獲取
# print(getattr(p,‘name‘))#egon
# print(getattr(p,‘x‘,"not exist"))#not exist
# #或者
# if hasattr(p,‘x‘):
# res = getattr(p,‘x‘)
# print(res)
刪除
print(people.__dict__)#有country
print(p.country)
delattr(people,‘country‘)
print(people.__dict__)#無country
day07面向對象進階