類
class MyString:
str ="xiaoming"
? ? def output(self):
print(self.str)
s = MyString()
s.output()
print(s.str)
構(gòu)造函數(shù)
class Myname:
。def __init__(self): #構(gòu)造函數(shù)
self.name ="xiaoming"
? ? def __del__(self):?#析造函數(shù)
print("byebye~")
def prf(self):
print(self.name)
del ps 刪除對(duì)象
析構(gòu)函數(shù)有一個(gè)固定的名稱,__del__().通常在析構(gòu)函數(shù)中釋放類所占用的資源。使用del刪除一個(gè)對(duì)象,釋放它所占用的資源
靜態(tài)方法無(wú)需傳入self參數(shù),因此在靜態(tài)方法中無(wú)法訪問(wèn)實(shí)例變量。
在靜態(tài)方法中不可以直接訪問(wèn)類的靜態(tài)變量,但可以通過(guò)類名引用靜態(tài)變量。
因?yàn)殪o態(tài)方法既無(wú)法訪問(wèn)實(shí)例變量,也不能直接訪問(wèn)類的靜態(tài)變量,所以靜態(tài)方法與定義它的類沒(méi)有直接關(guān)系,而是起到了類似函數(shù)工具庫(kù)的作用
類方法
類方法與靜態(tài)方法一樣,可以使用類名調(diào)用類方法
類成員方法也無(wú)法訪問(wèn)實(shí)例變量,但可以訪問(wèn)累的靜態(tài)變量
類方法需傳入代表本類的cls參數(shù)
可以使用@classmethod定義類方法
#類方法
class myname:#定義類
? ? val1 ="string 3"#靜態(tài)變量
? ? def __init__(self):
self.val2 ='value 2'
? ? @ classmethod #類方法
? ? def classmd(cls):
print('類' +str(cls) +',val1:' +cls.val1 +'無(wú)法訪問(wèn)val2的值')
可以通過(guò)對(duì)象名調(diào)用類方法,也可以通過(guò)類名調(diào)用類方法。
類方法有一個(gè)參數(shù)cls,代表定義類方法的類,可以通過(guò)cls訪問(wèn)類的靜態(tài)變量。
使用isinstance()函數(shù)判斷對(duì)象類型,返回True/False
print(isinstance(c,MyClass))
類的繼承和多態(tài)
#類的繼承和多態(tài)
import time
class Users:
username =""
? ? def __init__(self,uname):
self.username = uname
print("(構(gòu)造函數(shù):"+self.username+')')
#顯示用戶名
? ? def dispUserName(self):
print(self.username)
class UserLogin(Users):
def __init__(self,uname,lastLoginTime):
Users.__init__(self,uname)#調(diào)用父類Users的構(gòu)造函數(shù)
? ? ? ? self.lastLoginTime = lastLoginTime
def dispLoginTime(self):
print("登錄時(shí)間為:"+self.lastLoginTime) ? ??
#獲取當(dāng)前時(shí)間
now = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
抽象類和多態(tài)
抽象類是包含抽象方法的類,而抽象方法不包含任何實(shí)現(xiàn)的代碼,只能在其子類中實(shí)現(xiàn)抽象函數(shù)的代碼。
定義抽象類:需要從類庫(kù)abc導(dǎo)入ABCMeta類和abstractmethod類
from abcimport ABCMeta,abstractmethod
實(shí)現(xiàn)抽象類:可以從抽象類派生子類。方法與普通類的派生和繼承一樣
多態(tài):是指抽象類中定義的一個(gè)方法,可以在其子類中重新實(shí)現(xiàn),不同子類中的實(shí)現(xiàn)方法也不相同
#抽象類
class Shape(object):
__metaclass__ = ABCMeta
def __init__(self):
self.color ='black'#默認(rèn)使用黑色
? ? @abstractmethod
? ? def draw(self):pass
class circle(Shape):
def __init__(self,x,y,r):#定義圓心坐標(biāo)和半徑
? ? ? ? self.x = x
self.y = y
self.r = r
def draw(self):
print("Draw Circle:(%d,%d,%d)" %(self.x,self.y,self.r))
class line(Shape):
def __init__(self,x1,y1,x2,y2):#定義起止坐標(biāo)值
? ? ? ? self.x1 = x1
self.y1 = y1
self.x2 = x2
self.y2 = y2
def draw(self):
print("Draw Line:(%d,%d,%d,%d)" %(self.x1,self.y1,self.x2,self.y2))
在不同的子類中,抽象方法draw()有不同的實(shí)現(xiàn),這就是類的多態(tài)