oop即Object Oriented programming,面向對象編程python
何爲編程:特定的語法+數據結構+算法算法
編程範式就是從經驗中總結的套路:編程
面向過程編程安全
適用於簡單的腳本,一次任務是極好的,可是複雜的,須要後期維護的就**了數據結構
面向函數編程多線程
將電腦運算視爲數學上的函數計算函數式編程
優勢:可讀性強,由於數據不可變,因此多線程安全,完成同功能代碼量比oop少,更清晰,速度也要高不少函數
缺點:因爲數據不可變,因此很是佔用運算資源,先天設計致使性能一直不夠,要想大規模的使用函數式編程,還有不少問題oop
面向對象編程性能
世界萬物,皆可分類
世界萬物,皆爲對象
只要是對象,就屬於類
只要是對象,就有屬性
缺點:修改數據致使數據的不肯定性,爲了寫可重用的代碼而產生的無用代碼.並無徹底理解面向對象思想,爲了面向對象而面向對象,使得代碼晦澀難懂,後期維護產生問題..使用場景不能是性能苛刻的地方
oop簡介
類:用來描述具備相同的屬性和方法的對象的集合。它定義了該集合中每一個對象所共有的屬性和方法。對象是類的實例
類變量:類變量在整個實例化的對象中是公有的.類變量定義在類中,函數體以外,一般不做爲實例變量使用
數據成員:類變量或者實例變量用於處理類以及實例對象的相關的數據
方法重寫:若是從父類繼承的方法不能知足子類的需求,能夠對其進行改寫,這個過程叫作覆蓋,也叫方法重寫
實例變量:定義在方法中的變量,只做用於當前實例的類。
實例化:建立一個類的實例,類的具體對象。
方法:類中定義的函數。
對象:類(模型)通過實例化後更好的被程序所調用,一個類能夠實例化多個對象,一個對象能夠有多個屬性,對象包括兩個數據成員(類變量和實例變量)和方法
三大特性
封裝:在類中對數據的賦值,內部調用對外部是不可見的,這使類變成了一個容器
class people:
the_number_of_people = 0
def __init__(self,name,age):
self.Name = name
se;f.Age = age
def __del__(self):
print('It's over')
def eat(self):
print('%s is eating'%elf.Name)
def talk(self):
print('%s is talking'%self.Age)
def __init__(self): 方法是一種特殊的方法,被稱爲構造函數或者初始化方法
self 表明類的實例,表明當前對象的地址,,,self.Name則指向類..self 在定義類的方法時是必須有的,雖然在調用時沒必要傳入相應的參數。
the_number_of_people變量是一個類變量,他的值將會在這個類的全部實例之間共享,你能夠在內部類或者外部類使用people.the_number_of_people訪問
建立實例對象
peo1 = people('slz',19)建立people類的地一個對象
peo2 = people('sunlizhao',19.9)建立people的第二個對象
訪問屬性,調用方法
能夠經過( . )來訪問對象的屬性
peo1.the_number_of_people #屬性
peo2.talk() #方法
類的方法
在類的內部,使用def關鍵字來定義一個方法,跟通常函數定義不一樣,類方法必須包含參數self,且爲第一個參數,self表明類的實例
class people:
def __init__(self,name,age):
self.Name = name
self.Age = age
def __del__(self):
print("It's over")
def eat(self):
print('%s說:我%s歲了'%(self.Name,self.Age))
peo1 = people('slz',19)
peo1.eat()
繼承:一個類派生出子類,子類自動繼承父類的屬性和方法,若是一種語言不支持繼承,那麼類就沒什麼意義
多繼承
class people:
def __init__(self,name,age):
self.Name = name
self.Age = age
def __del__(self):
print("It's over")
def eat(self):
print('%s說:我%s歲了'%(self.Name,self.Age))
class speaker:
__weight = 0
def __init__(self,name,topic):
self.Name = name
self.Topic = topic
def speak(self):
print('自我介紹一下,我是%s,今天個人演講主題是%s'%(self.Name,self.Topic))
class sample(people,speaker):
def __init__(self,name,age,topic):
people.__init__(self,name,age)
speaker.__init__(self,name,topic)
text = sample('slz',19,'python')
text.eat()
text.speak()
__weight是私有屬性,私有屬性在類外部沒法直接進行訪問
方法重寫
class Parent: # 定義父類
def myMethod(self):
print ('調用父類方法')
class Child(Parent): # 定義子類
def myMethod(self):
print ('調用子類方法')
c = Child() # 子類實例
c.myMethod() # 子類調用重寫方法
super(Child,c).myMethod() #用子類對象調用父類已被覆蓋的方法
super()函數用來調用父類的一個方法
私有屬性
class JustCounter:
__secreCount = 0
publicCount = 0
def pount(self):
self.__secreCount += 1
self.publicCount += 1
print(self.__secreCount)
counter = JustCounter()
counter.pount()
counter.pount()
print(counter.publicCount)
print(counter.__secreCount) #報錯,實例不能訪問私有變量
私有方法
#私有方法
class people_:
def __init__(self,name,age):
self.Name = name
self.Age = age
def __del__(self):
print('我還愛大家')
def __haha(self):
print('看不到我,氣不氣!!!')
peo_1 = people_('slz',58)
peo_1.__haha #報錯,私有方法外部不能調用
類的專有方法
__doc__:類的描述信息
class dog:
'''It's gou 的描述'''
print(dog.__doc__)
多態:接口的多種實現即爲多態
多態的目的是:實現接口重用
python中沒有直接的語法定義多態
class Animal:
def __init__(self,name):
self.name = name
def talk(self):
print('lalala')
def animal_talk(obj):
obj.talk()
class Car(Animal):
def talk(self):
print('%s miao,miao,miao'%self.name)
class Dog(Animal):
def talk(self):
print('%s wang,wang,wang'%self.name)
a = Car('猴子')
b = Dog('李*華')
Animal.animal_talk(a)
Animal.animal_talk(b)