Python面向物件技術
阿新 • • 發佈:2018-12-21
物件(object):基本上可以看做資料(特性)以及由一系列可以存取、操作這些資料的方法所組成的集合。使用物件替代全域性變數和函式的原因有很多種,其中物件最重要的優點包括以下幾點:
多型(Polymorphism):
意味著就算不知道變數所引用的物件型別是什麼,還是能對它進行操作,而它也會根據物件(或類)型別的不同而表現出不同的行為。
封裝(Encapsulation):
指向程式中的其他部分隱藏物件的具體實現細節的原則。
繼承(Inheritance):
以通用的類為基礎建立專門的類物件。
建立類:
_metaclass_=type #確定使用新式類 class Person: def setName(self,name): self.name=name def getName(self): return self.name def greet(self): print("Hello world! I'm %s"%self.name) foo=Person() bar=Person() foo.setName('Luke Skywalker') bar.setName('Anakin Skywalker') foo.greet() bar.greet() 輸出: Hello world! I'm Luke Skywalker Hello world! I'm Anakin Skywalker
引數self:是對於物件自身的引用,在呼叫foo的setName和greet函式時,foo自動將自己作為第一個引數傳入函式中-------因此形象的命名為self。
特性、函式和方法:
self引數事實上正式方法和函式的區別。方法:將它們的第一個引數繫結到所屬的例項上,因此無需顯示提供該引數。當然也可以將特性繫結到一個普通函式上,這樣就不會有特殊的self引數了:
class Class: def method(self): print('i have a self!') def function(): print("i don't...") instance=Class() instance.method() instance.method=function instance.method() 輸出: i have a self! i don't...
注意:self引數並不依賴於呼叫方法的方式,前面我們使用的是instance.method(例項.方法)的形式,可以隨意使用其他變數引用同一個方法:
class Bird:
song='Squaawk!'
def sing(self):
print(self.song)
bird =Bird()
bird.sing()
birdsong=bird.sing
birdsong()
輸出:
Squaawk!
Squaawk!
變數birdsong引用繫結方法bird.sing上,也就意味著這還是會對self引數進行訪問(它仍舊繫結到類的相同例項上)。
指定超類:子類可以擴充套件超類的定義,將其他類名寫在class語句後的圓括號內可以指定超類:
class Filter:#作為SPAMFilter的超類
def init(self):
self.blocked=[]
def filter(self,sequence):
return [x for x in sequence if x not in self.blocked]
class SPAMFilter(Filter):#SPAMFilter是Filter的子類,將“SPAM'從序列中過濾出去
def init(self):#重寫Filter超類中的init方法
self.blocked=['SPAM']
f=Filter()
f.init()
print(f.filter([1,2,3,'SPAM']))
s=SPAMFilter()
s.init()
print(s.filter(['SPAM','SPAM','SPAM','EGGS','BACON','SPAM']))#繼承了Filter方法中的filter方法
輸出:
[1, 2, 3, 'SPAM']
['EGGS', 'BACON']
檢查繼承:要想檢視一個類是否是另一個的子類,可以使用內建的issubclass函式:
print(issubclass(SPAMFilter,Filter))
print(issubclass(Filter,SPAMFilter))
輸出:
True
False