python06——面向物件基礎(2)
1.析構方法
當一個物件被刪除或者被銷燬時,python直譯器會預設呼叫一個方法,這個方法為__del__ ()方
法,也稱為析構方法
##程式執行結束自動呼叫__del__方法 class Animal(object): def __init__ (self, name): self.name = name print('__init__方法被呼叫') #析構方法,當物件被銷數時python解析器會自動呼叫 def __del__(self): print('__del__方法被呼叫') print('%s物件被銷燬'%self.name) dog = Animal('旺柴')
也可手動刪除: del dog
2.單繼承
python中面向物件的三大特徵:封裝、繼承、多型
封裝:把內容封裝到某個地方,便於後面的使用。對於封裝來說其實就是使用初始化構造方法將內容封裝到物件中,然後通過物件直接或者self來獲取被封裝的內容
繼承:子類可以繼承父類的方法
3.多繼承
可以繼承多個父類
class Animal: def eat(self): print('吃飯啦') def drink(self): pass print("喝水啦") class say: def said(self): print('我是一隻小動物') class Dog(Animal): ##繼承了Animal父類的方法 def wwj(self): print('汪汪') class Cat(Animal,say): ###繼承了Animal、say類 def mmj(self): print('喵~~') d1=Dog() d1.eat() d2=Cat() d2.said()
class D(): def eat(self):繼承順序print('D方法') class C(D): def eat(self): print('C方法') class B(D): pass class A(B,C): pass a=A() a.eat() print(A.__mro__) ####A->B->C->D 廣度優先 class E: def eat(self): print('E方法') class D: def eat(self): print('D方法') class C(D): pass class B(E): pass class A(B,C): pass a=A() a.eat() ##呼叫eat類 print(A.__mro__) ####A->B->E->C 深度優先
4.繼承的傳遞、重寫父類方法、呼叫父類方法
son類繼承了father類,father類繼承了grandfather類,那麼son也繼承了grandfather類
class Dog(): def __int__(self,name,color): Dog.name=name Dog.color=color def bark(): print('汪汪') class kejiquan(Dog): def __int__(self,name,color): Dog.__int__(self,name,color)###呼叫父類 #自動繼承父類super().__int__(name,color) ##拓展其他屬性 self.age=12 def __str__(self): return '{}的顏色是{} 年齡是{}'.format(self.name,self.color,self.age) def bark(self): ##重寫類 super().bark() print('好凶')
5.多型
多型——定義時的型別和執行時的型別不一樣。
優點:增加程式的靈活性和擴充套件性。要實現多型,有兩個前提需要遵守:①繼承②重寫
##父類 class Animal: def say_who(self): print('我是一個動物') ##子類 class Duck(Animal): def say_who(self): ##子類重寫父類 print('我是一隻小鴨子') class Dog(Animal): def say_who(self): print('我是哈趴狗') class Cat(Animal): def say_who(self): print('我是小貓咪') def commonInvoke(obj): ##統一呼叫方法 obj.say_who() listobj=[Duck(),Dog(),Cat()] for i in listobj: commonInvoke(i)
8.類屬性和例項屬性
類屬性——類物件所擁有的屬性,它被所有類物件的例項物件所共有,類物件和例項物件可以訪問
例項屬性——例項物件所擁有的屬性,只能通過例項物件訪問
class Student: name='李明' ##屬於類屬性,就是student類物件所擁有的的 def __init__(self,age): self.age=age ##例項屬性 lm=Student(18) print(lm.name) #通過例項物件去訪問類屬性 print(lm.age) xh=Student(28) print(xh.name) print(xh.age) print(lm.name) #通過例項物件去訪問類屬性 print(lm.age) print(Student.name) ###通過類物件student去訪問name print(Student.age) ###訪問不了
9.類方法和靜態方法
類方法:
類物件所擁有的方法,需要用裝飾器@classmethod來標識其為類方法,對於類方法,第一個引數必須是類物件,一般以cls作為第一個引數,類方法可以通過類物件,例項物件呼叫
class Person(object): country = 'china' #類屬性 def_init (self,name): self.name = name #類方法,用裝飾器classmethod裝飾 @classmethod def get_country(cls) print(cls.country) @classmethod def get_country(cls,data) cls.country=data ##修改類屬性的值,在類方法中 people = Person('xiaoming') result = Person.get_country() #獲取類屬性 #打印出'china' Person.get_country('英國') print(Person.get_country()) ##通過類物件去引用
靜態方法:
類物件所擁有的方法,需要用@staticmethod來表示靜態方法,靜態方法不需要任何引數。由於靜態方法主要來存放邏輯性的程式碼,本身和類以及例項物件沒有互動,也就是說在靜態方法中,不會涉及到類中方法和屬性的操作
class Person(objed): country= 'china' #類屬性 def __init__(self, name): self.name = name #靜態方法,用裝飾器staticmethod裝飾 @staticmethod def get country(): #靜態方法不用傳任何引數 print(Person.country) people = Person('xiaoming') result = Person.get_country() #獲取類屬性 #輸出'china'
比如:返回當前系統時間
import time class TimeTest: def __int__(self,hpur,min,second): self.hour=hour self.min=min self.second=second @staticmethod def showTime(): return time.strftime("%H:%M:%S",time.localtime()) print(TimeTest.shouTime()) t=TimeTest(2,10,15) print(t.showTime) ##沒有必要通過這種方法去訪問靜態方法
幾種方法的對比:
類方法——第一個引數是類物件cls,通過cls引用的類物件的屬性和方法。
例項方法——第一個引數是例項物件self,通過self引用的可能是類屬性、也有可能是例項屬性(這個需要具體分析),不過在存在相同名稱的類屬性和例項屬性的情況下,例項屬性優先順序更高。
靜態方法——不需要額外定義引數,因此在靜態方法中引用類屬性的話,必須通過類物件來引用。