Python 高級編程之面向?qū)ο?/h1>
科班出身的同學應該學過C語言、C++或者Java,編程語言一般分為兩種設計方式:面向過程編程、面向?qū)ο缶幊?,早期的編程語言多數(shù)是面向過程的,像C語言就是面向過程編程,面向過程由多個過程組合在一起,也可以理解為函數(shù)編程,而Python在設計的時候就是一種面向?qū)ο缶幊痰恼Z言,其實python把面向?qū)ο蠛喕撕芏?,如果學過java的同學再來學習python面向?qū)ο缶蜁杏X非常簡單。所以本篇文章就讓我?guī)е蠹襾韺W習一下什么是面向?qū)ο缶幊獭?/p>

類(Class)——用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
類方法——類中定義的函數(shù)。
類屬性——屬性就是類變量。
方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
實例變量——在類的聲明中,屬性是用變量來表示的,這種變量就稱為實例變量,實例變量就是一個用 self 修飾的變量。
繼承——即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬"是一個(is-a)"關系(例圖,Dog是一個Animal)。
實例化——創(chuàng)建一個類的實例,類的具體對象。
對象——通過類定義的數(shù)據(jù)結構實例。對象包括兩個數(shù)據(jù)成員:屬性和方法。
對象可以分為兩個部分:一部分稱為屬性(變量),一部分稱為行為(方法)。
1)類定義
語法格式如下:
class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>示例如下:
#!/usr/bin/python3
 
class MyClass:
    """一個簡單的類實例"""
    i = 12345
    def f(self):
        return 'hello world'
 
# 實例化類
x = MyClass()
 
# 訪問類的屬性和方法
print("MyClass 類的屬性 i 為:", x.i)
print("MyClass 類的方法 f 輸出為:", x.f())2)類屬性
python類屬性分為:私有屬性和公開屬性,python是沒有什么修飾符的,像java就分的更細致,通過private(私有級)、protected(受保護級)、無前綴(默認級)、public(公開級)控制權限。
- 私有屬性(__private_attrs):兩個下劃線開頭,聲明該屬性為私有,不能在類的外部被使用或直接訪問。在類內(nèi)部的方法中使用時 self.__private_attrs。
 - 公開屬性(private_attrs):不帶兩個下劃線開頭,可以在類外訪問,通過實例名訪問,也可以在類中訪問。
 
示例如下:
#!/usr/bin/python3
 
class JustCounter:
    __secretCount = 0  # 私有變量
    publicCount = 0    # 公開變量
 
    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print (self.__secretCount)
 
counter = JustCounter()
counter.count()
counter.count()
print (counter.publicCount)
print (counter.__secretCount)  # 報錯,實例不能訪問私有變量3)類方法
類方法也是分為:私有方法和公開方法,但是私有變量屬性一把通過set/get公開方法操作。示例如下:
class Parents(object):
    __name = "test"
    __age = 35
    
    # 設置姓名
    def set_name(self, name):
        self.__name = name
    
    # 獲取姓名
    def get_name(self):
        return self.__name
        
    # 設置年齡
    def set_age(self, age):
        self.__age = age
    
    # 獲取年齡
    def get_age(self):
        return self.__age
if __name__ == "__main__":
    # 實例化
    p = Parents()
    # 調(diào)用公有方法去設置屬性
    p.set_age(30)
    # 獲取私有屬性
    print(p.get_age())
    
    # 調(diào)用公有方法去設置屬性
    p.set_name("zhangsan")
    # 獲取私有屬性
    print(p.get_name())【溫馨提示】self 的名字并不是固定的,也可以使用 this,但是最好還是按照約定使用 self。
4)構造方法(init)
init : 構造函數(shù),在生成對象時調(diào)用。
示例如下:
class Parents(object):
    __name = "test"
    __age = 35
    
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    
    # 設置姓名
    def set_name(self, name):
        self.__name = name
    
    # 獲取姓名
    def get_name(self):
        return self.__name
        
    # 設置年齡
    def set_age(self, age):
        self.__age = age
    
    # 獲取年齡
    def get_age(self):
        return self.__age
if __name__ == "__main__":
    # 實例化
    p = Parents(25, "lisi")
    # 獲取私有屬性
    print(p.get_age())
    # 獲取私有屬性
    print(p.get_name())不單單有構建函數(shù),還有其它專有的函數(shù),都是自動去調(diào)用的:
- __init__ : 構造函數(shù),在生成對象時調(diào)用
 - __del__ : 析構函數(shù),釋放對象時使用
 - repr : 打印,轉換
 - setitem : 按照索引賦值
 - getitem: 按照索引獲取值
 - len: 獲得長度
 - cmp: 比較運算
 - call: 函數(shù)調(diào)用
 - add: 加運算
 - sub: 減運算
 - mul: 乘運算
 - truediv: 除運算
 - mod: 求余運算
 - pow: 乘方
 
三、面向?qū)ο蠓庋b、繼承和多態(tài)
面向?qū)ο缶幊逃腥筇攸c:封裝、繼承和多態(tài)。
1)封裝
就是將一個類的屬性、方法全部包裝到了一個類中。一般設置屬性為私有的,通過方法去調(diào)用,當然有些方法只需要在類內(nèi)部使用也是可以設置成私有的方法的,通過公開的方法來供外部間接調(diào)用這些“封裝”好的屬性和方法,這就是封裝。
其實上面的示例就是很好的證明,內(nèi)部定義私有屬性,外部通過公開的方法訪問。
class Parents(object):
    __name = "test"
    __age = 35
    
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    
    # 設置姓名
    def set_name(self, name):
        self.__name = name
    
    # 獲取姓名
    def get_name(self):
        return self.__name
        
    # 設置年齡
    def set_age(self, age):
        self.__age = age
    
    # 獲取年齡
    def get_age(self):
        return self.__age
if __name__ == "__main__":
    # 實例化
    p = Parents(25, "lisi")
    # 獲取私有屬性
    print(p.get_age())
    # 獲取私有屬性
    print(p.get_name())2)繼承
繼承就非常好理解了,其實通過字面意思理解就行了,一個類是另一個類的子類,那么這個類就可以擁有和父類一樣的屬性、方法。這就好比是現(xiàn)實當中,兒子繼承父母的遺產(chǎn)一樣。但是需要注意的是私有屬性和私有方法是無法繼承的,其它語言也是一樣的。
在Python中,所有類默認繼承object類,object類是頂級類或基類;其他子類叫做派生類。
示例如下:
class Animal(object):
    # 無法給繼續(xù)子類
    __name = ""
    # 可以繼承給子類
    color = ""
    def __init__(self, name, color):
        self.__name = name
        self.color = color
    # 可以繼承給子類
    def set_name(self, name):
        self.__name = name
    def get_name(self):
        return self.__name
    def set_color(self, color):
        self.color = color
    # 無法給繼續(xù)子類
    def __get_color(self):
        return self.color
class Cat(Animal):
    def __init__(self, name, color):
        self.name = name
        self.color = color
        # 調(diào)用父類構造函數(shù)
        super(Cat, self).__init__(name, color)
        # Animal.__init__(name, color)
    # 重寫父類方法
    def set_name(self, name):
        self.name = name
    # 重寫父類方法
    def get_name(self):
        return self.name
if __name__ == "__main__":
    c = Cat("小貓", "黑色")
    # 獲取父類公開屬性
    print(c.color)
    # 調(diào)用子類方法重寫的方法
    c.set_name("大貓")多繼承:所謂多繼承意思就是一個類同時繼承了多個父類
示例如下:
#類定義
class people:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類外部無法直接進行訪問
    __weight = 0
    #定義構造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說: 我 %d 歲。" %(self.name,self.age))
 
#單繼承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #調(diào)用父類的構函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆寫父類的方法
    def speak(self):
        print("%s 說: 我 %d 歲了,我在讀 %d 年級"%(self.name,self.age,self.grade))
 
#另一個類,多重繼承之前的準備
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一個演說家,我演講的主題是 %s"%(self.name,self.topic))
 
#多重繼承
class sample(speaker,student):
    a =''
    def __init__(self,n,a,w,g,t):
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)
 
test = sample("Tim",25,80,4,"Python")
test.speak()   #方法名同,默認調(diào)用的是在括號中參數(shù)位置排前父類的方法3)子類重新方法和super()調(diào)用父類方法
class Parent:        # 定義父類
   def myMethod(self):
      print ('調(diào)用父類方法')
 
class Child(Parent): # 定義子類
   # 重新父類方法
   def myMethod(self):
      print ('調(diào)用子類方法')
 
c = Child()          # 子類實例
c.myMethod()         # 子類調(diào)用重寫方法
super(Child,c).myMethod() #用子類對象調(diào)用父類已被覆蓋的方法4)多態(tài)
多態(tài)首先是建立在繼承的基礎上的,先有繼承才能有多態(tài)。多態(tài)是指不同的子類在繼承父類后分別都重寫覆蓋了父類的方法,即父類同一個方法,在繼承的子類中表現(xiàn)出不同的形式。多態(tài)成立的另一個條件是在創(chuàng)建子類時候必須使用父類new子類的方式。
示例如下:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def print_age(self):
        print("%s's age is %s" % (self.name, self.age))
class Man(Person):
    def print_age(self):
        print("Mr. %s's age is %s" %(self.name, self.age))
class Woman(Person):
    def print_age(self):
        print("Ms. %s's age is %s" %(self.name, self.age))
def person_age(person):
    person.print_age()
if __name__ == "__main__":
    person = Person("kevin", 23)
    man = Man("Bob", 33)
    woman = Woman("Lily", 28)
    person_age(person)
    person_age(man)
    person_age(woman)【總結】其實多態(tài)也很好理解,就是將不同的對象傳到相同的函數(shù),表現(xiàn)不同的形態(tài),這就是多態(tài)。
 
2011-07-14 17:24:10
2011-07-14 17:37:02
2023-01-10 09:06:17
 
 
 














 
 







 