亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 7021 | 回復: 0
打印 上一主題 下一主題

Python面向對象初級教程 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-01-11 17:01 |只看該作者 |倒序瀏覽
'''
    python不單單用作結構化編程,她還是面向對象的高級語言,支持類(class),本文將介紹Python面向對象的編程思想。類(class)被用來用戶自定義數(shù)據(jù)類型,用戶使用類(class)來組織數(shù)據(jù),管理數(shù)據(jù)。
    類(class)的定義
    類(class)的屬性(attribute)
    類(class)的方法(method)
    類(chalss)成員的控制域
    類(class)的繼承與組合
1.類的定義,類的定義使用關鍵字class,后跟類的名稱,及":"。如定義一個Point類
'''
# 定義一個空的類,沒有任何屬性與方法
class Point:
    pass
'''
向類中添加類屬性(有的稱之為類成員),類屬性與其它的變量使用方法一致,第一次使用便是對此變量的定義,屬性的作用域為整個類,即這個類的所有方法可以訪問此屬性,定義Point屬性的屬性x和y
'''
# 定義一個空的類,沒有任何屬性與方法
class Point:
    # 定義x和y坐標
    x = 10
    y = 10
'''
類方法為特殊的函數(shù),其定義方法與函數(shù)類似,但有一個默認的參數(shù)self,表示此類對象的實例(instance),定義類的方法,設置x的方法setX和獲取x的方法getX。
'''
# 定義一個完整的類,包含屬性與方法
class Point:
    # 定義x和y坐標
    x = 10
    y = 10
    def setX(self,x_):
        self.x = x_
    def getX(self):
        return self.x
    def setY(self,y_):
        self.y = y_
    def getY(self):
        return self.y
    def setXY(self,x_,y_):
        self.setX(x_)
        self.setY(y_)
'''
注意:這個類方法如何訪問類屬性,使用self.x,而不是x。python類方法與C++不同,類的成員方法不會自動使用類的屬性,必須使用self明確指定。如果只使用x,則在setX函數(shù)中創(chuàng)建了一個變量x,并將其值設置為_x。
    同樣對于類方法之間互相訪問時也必須使用self指定為調(diào)用的為類的方法。
'''
# python還支持在類定義塊之外定義方法,這個方法滿足類方法,例如先定義一個函數(shù)outX
def out_setX(self,x_):
    self.x = x_
# 然后定義類,并將類成員h賦值為out_setX
class Point:
    x = 10
    y = 10
    setX = out_setX
'''
創(chuàng)建一個類的對象,并訪問這個類的屬性和方法
'''
# 創(chuàng)建Point的一個對象
pt = Point()
# 設置坐標x的值
pt.x = 10
# 獲取坐標x的值
print pt.x
# 訪問對象的方法
pt.setX(20)
'''
    C++中有函數(shù)重載的概念,python則沒有,如果有如下函數(shù)定義
def f():
    print 'f'
def f(x):
    print 'f(x)'
f()
f(20)
出錯信息
TypeError: f() takes exactly 1 argument (0 given)
由于f先定義為無參數(shù)的函數(shù),后有定義為帶一個參數(shù)的函數(shù),及f被重新定義,所以再次調(diào)用
f()時,解釋器抱怨找不到無參數(shù)名稱為f的函數(shù)。但可以使用如下
def f():
    print 'f'
def f(x):
    print 'f(x)'
#此id已被重新定義,可以這樣解釋:
##    x = 10
##  x = 20
#此時x的值已經(jīng)被改編為20,已不再是10無法在訪問10
#f()
f(20)
'''
'''
    C++還有構造函數(shù)(constructor)的概念,這個函數(shù)為一特殊的函數(shù),在創(chuàng)建對象時自動被調(diào)用,python中也沒有構造函數(shù),有一個功能類似的函數(shù),用來初始化類屬性,這個函數(shù)為:
__init__,如下代碼,在創(chuàng)建對象時將類屬性初始化
'''
class Point:
    x = 10
    y = 10
    def __init__(self,x_,y_):
        self.x = x_
        self.y = y_
# 將坐標(x,y)設置為(20,20)        
pt = Point(20,20)
print pt.x,pt.y
'''
類的成員(屬性和方法),python默認使用public,即屬性與方法可以被直接訪問,這一點與C++也不相同,python改變屬性可見性的是通過表示ID,私有成員以"前導字符_至少兩個,后尾字符_最多一個"表示,如定義私有屬性和私有方法
私有屬性:
    __pri1        前導字符個數(shù)2
    ___pri2        前導字符個數(shù)3
    ____pri3_    前導字符個數(shù)4,后尾字符1
共有屬性:
    _pub1        前導字符1
    ___pri2__    前導字符3,后尾字符2
'''
class Point:
    # 私有屬性,只能通過類方法訪問
    __x = 10
    # 私有方法,可被其他類方法調(diào)用
    def __setX(self,x_):
        # 訪問私有屬性
        self.__x = x_
    def setX(self,x_):
        # 調(diào)用私有方法
        self.__setX(x_)
    def getX(self):
        # 訪問私有屬性
        return self.__x
pt = Point()
# 直接訪問__x
# pt.__x
# 解釋器會抱怨沒有__x屬性
# AttributeError: Point instance has no attribute '__x'
# 訪問私有方法
# pt.__setX(10)
# 解釋器還是會抱怨沒有屬性__setX(python視方法也為屬性)
print pt.getX()
pt.setX(20)
print pt.getX()
'''
在類中可以定義屬性,有此類創(chuàng)建的對象可以使用此類的所有屬性,除此之外,python還支持動態(tài)向類或類對象中添加屬性。向類中添加屬性,其后所有的類對象便可以使用新添加的屬性;若向類對象中添加屬性,只用此類對象可以使用此屬性
'''
'''向類中添加屬性'''
class Point:pass
# 向類中添加屬性z
Point.z = 30
# 創(chuàng)建類對象
pt = Point()
pp = Point()
# 訪問類屬性z
print Point.z
# 訪問類對象屬性z,pp與pt均含有屬性z
print pt.z,pp.z
'''向類對象中添加屬性'''
class Point:pass
pt = Point()
pp = Point()
# 向類對象中添加屬性
pt.z = 10
# 訪問類的屬性
# print Point.z
# 解釋器抱怨沒有屬性z
#AttributeError: class Point has no attribute 'z'
print pt.z
# 訪問pp對象的屬性z
# print pp.z
#解釋器抱怨沒有z屬性
#AttributeError: Point instance has no attribute 'z'
'''
類的繼承與組合,實現(xiàn)代碼重用。不用copy&paste代碼,當創(chuàng)建新類時,不必全部從頭開始,盡可能的使用已有代碼。TIC++中使用兩種方法:一種稱為組合(composition);另一種稱為繼承(inheritance)。
繼承語法格式:
class class DerivedClassName(BaseClassName):pass
'''
'''子類訪問父類屬性'''
class Point:
    x = 10
    y = 20
    def setX(self,x_):
        self.x = x_
    def getX(self):
        return self.x
   
class Circle(Point):
    r = 5
# 創(chuàng)建父類對象   
pt = Point()
# 創(chuàng)建子類對象
cl = Circle()
# 訪問父類的屬性
print cl.x,cl.y
# 訪問父類的方法
cl.setX(40)
print cl.x,cl.y
'''重載父類屬性,訪問Circle屬性'''
class Point:
    x = 10
    y = 20
    def setX(self,x_):
        self.x = x_
    def getX(self):
        return self.x
   
class Circle(Point):
    x = 40
    y = 50
    r = 5
# 創(chuàng)建父類對象   
pt = Point()
# 創(chuàng)建子類對象
cl = Circle()
# 訪問Circle類的屬性
print cl.x,cl.y
# 40,50
'''重載父類屬性,訪問父類Point屬性'''
class Point:
    x = 10
    y = 20
    def setX(self,x_):
        self.x = x_
    def getX(self):
        return self.x
   
class Circle(Point):
    x = 40
    y = 50
    r = 5
    # 訪問父類的屬性
    def callBase(self):
        # x,y已經(jīng)被Circle重載,顯示使用父類訪問父類屬性
        print Point.x,Point.y
# 創(chuàng)建子類對象
cl = Circle()
# 訪問Point類的屬性
cl.callBase()
# 10,20
'''
C++語言中的子類會自動調(diào)用父類的構造函數(shù),python中的__init__不會自動調(diào)用父類的__init__,如果要調(diào)用必須顯示的調(diào)用父類的__init__
'''
'''重載父類屬性,訪問父類屬性'''
class Point:
    def __init__(self):
        print 'Point'
   
class Circle(Point):
    def __init__(self):
        # 顯示調(diào)用父類的__init__函數(shù)
        Point.__init__(self)
        print 'Circle'
cl = Circle()
# Point
# Circle
'''
C++有抽象類,此類只定義函數(shù)接口(有的稱之為interface),其具體的實現(xiàn)有子類來實現(xiàn),python沒有抽象類,實現(xiàn)方法:將基類函數(shù)接口設置為None,如果使用此基類創(chuàng)建對象,調(diào)用此函數(shù)時會出現(xiàn)異常,具體實現(xiàn)由其子類實現(xiàn)
'''
#抽象類
class Graphic:
    draw = None
# 實現(xiàn)Graphic的draw
class Point(Graphic):
    x = 10
    y = 10
    # 將draw賦值
    def __init__(self):
        self.draw = self.__draw
    # 實現(xiàn)抽象接口
    def __draw(self):
        print self.x,self.y
# 實現(xiàn)Graphic的draw
class Circle(Point):
    r = 5
    # 將draw賦值
    def __init__(self):
        self.draw = self.__draw
    # 實現(xiàn)抽象接口
    def __draw(self):
        print self.x,self.y,self.r
# 創(chuàng)建各個類的對象
gp = Graphic()
pt = Point()
cl = Circle()
#gp.draw()
# 函數(shù)調(diào)用出錯
#TypeError: 'NoneType' object is not callable
# 調(diào)用Point的draw
pt.draw()
# 調(diào)用Circle的draw
cl.draw()
'''
類的組合:類的另一種重用方式,《C++ Primer plus》有介紹適用于此設計方法的類與類之間的關系,稱之為”has-a“關系,與繼承”is-a“關系相對應。
”is-a“關系:
圓柱(cylinder)is-a特殊的圓(circle),它含有高度屬性,圓(circle)為圓柱(cylinder)的父類;
圓(circle)is-a特殊的點,它含有半徑屬性,點(point)為圓(circle)的父類
'''
# 定義父類及子類
class Point:pass
class Circle(Point):pass
class Cylinder(Circle):pass
'''
”has-a"關系:
畫布(canvas)上可以繪制各種圖形(如:點(point)、圓(circle)和圓柱(cylinder)等)。繪圖程序
定義如下關系
'''
# 定義容器類
class Canvas:
    # 包含三個類對象Point、Circle和Cylinder
    pt = Point()
    cl = Circle()
    cy = Cylinder()
    def __init__(self):
        pass
               
               
               

本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u3/110083/showart_2145879.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP