1. 程式人生 > 實用技巧 >python06——面向物件基礎(2)

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引用的可能是類屬性、也有可能是例項屬性(這個需要具體分析),不過在存在相同名稱的類屬性和例項屬性的情況下,例項屬性優先順序更高。

靜態方法——不需要額外定義引數,因此在靜態方法中引用類屬性的話,必須通過類物件來引用。