1. 程式人生 > >Python面向物件技術

Python面向物件技術

物件(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