国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python面向對象之類和對象實例詳解

2020-01-04 13:53:15
字體:
來源:轉載
供稿:網友

本文實例講述了Python面向對象之類和對象。分享給大家供大家參考,具體如下:

類和對象(1)

對象是什么?

對象=屬性(靜態(tài))+方法(動態(tài));

屬性一般是一個個變量;方法是一個個函數;

#類的屬性 就是 類變量

#實例變量:定義在方法中的變量,只作用于當前實例的類。

例子:

class Turtle:#python 中類名約定以大寫字母開頭  '''關于類的簡單例子。。。'''  #屬性 == 類變量  color ="green"  weight="10kg"  legs=4  shell=True  mouth='big'  #方法  def climb(self):    self.name = "test"  #實例變量:定義在方法中的變量,只作用于當前實例的類。    print("我在很努力爬。")  def run(self):    print('我在很努力跑。')  def bite(self):    print('我要要要要要')  def sleep(self):    print('我要睡覺啦。')#創(chuàng)建一個實例對象也就是類的實例化!tt =Turtle() #類的實例化,也就是創(chuàng)建一個對象,類名約定大寫字母開頭tt.bite() #創(chuàng)建好類后就能調用類里面的方法叻;tt.sleep()

面向對象的特征:

oo = Object Oriented(面向對象)

1.封裝(信息隱蔽技術)

python的列表list其實就是一個對象,它提供了很多方法:sort()、append()

封裝后就可以直接調用里面的方法了?。?!

2.繼承

 子類自動共享父類之間數據和方法的機制。

class MyList(list):#創(chuàng)建一個類繼承l(wèi)ist的所有方法和屬性   pass   #相當于一個占位符list1=MyList()  #類實例化list1.append(1)  #繼承后調用list的方法append()

3.多態(tài)

不同對象對同一方法響應不同行動。就是名字一樣方法不一樣:

>>> class A:    def fun(self):       print('aaaa')>>>class B ():    def fun(self):       print('bbb')>>> a=A()>>>b=B()>>>a.fun()aaaa>>>b.fun()bbb

類和對象(2)

self是什么?

如果把類當做圖紙,那么由類實例化后的對象就是可以住人的房子。self就相當于房子的門牌號,由self就可以找到對象。

一個類可以生成無數個對象,對象之間都很相似,因為都是來源與類的方法屬性。當對象方法被調用時,對象就會將自己作為第一個參數傳給self,python就是根據self知道哪一個對象在調用方法;

>>>class Ball():    def setname(self,name):       self.name=name    def kick (self):       print("我叫%r,誰踢我"%self.name)>>>a=Ball()  實例化生成a對象>>>a.setname('a') 調用方法設名為a>>>b=Ball()>>>b.setname('b')>>>c=Ball()>>>c.setname()>>>a.kick ()  通過self知道是哪個對象調用kick方法我叫'a',誰踢我>>>b.kick()我叫'b',誰踢我

python的魔法方法:

__init__(self) 這個是構造方法。

實例化一個對象時,這個方法就會在對象創(chuàng)建時(實例化類就是創(chuàng)建對象)自動調用。實例化時就會調用__init__(self)這個方法。

實例化對象是可以傳入參數的,這些參數被傳入init方法中,可通過重寫方法來自定義對象初始化操作。

>>>class Ball:    def __init__(self,name):       self.name = name    def kick(self):       print('我叫%r,誰踢我'%self.name)>>> b=Ball('b') #創(chuàng)建對象,這時__init__(self):就被調用了,可以傳入b>>>b.kick()我叫'b',誰踢我

公有和私有:

公有和私有數據類型。python中對象的屬性和方法都是公開的都是公有的通過.操作符訪問。

python中定義私有變量只需在變量名或函數名前增加兩個下劃線‘__',那么這個函數、變量變?yōu)樗降牧恕?/p>

>>> class P():    __name="liyue"  #私有變量,外部不能通過.操作符直接訪問了

類和對象(3):繼承

語法:

class A(B):   ………….

B我們叫父類、基類或超類;

A我們叫子類,子類繼承父類的屬性和方法;

例子:

>>> class Parent():    defhello(self):       print("helloliyue!")>>> class Child(Parent):    pass>>> p=Parent()>>> p.hello()hello liyue!>>> c=Child()>>> c.hello()hello liyue!

注意:如果子類中定義與父類同名的方法或屬性,則會自動覆蓋父類對應的方法或屬性。

例子:

>>> class Parent():    defhello(self):       print("helloliyue!")>>> class Child(Parent):    defhello(self):       print("hahah!")>>> p=Parent()>>>p.hello ()hello liyue!>>> c =Child()>>>c.hello () #子類和父類方法相同,(子類重寫父類方法)會覆蓋父類方法,但是父類自己的方法不變hahah!

super()函數:解決了子類就算重寫父類方法或屬性仍然可以繼續(xù)使用父類的方法和屬性。

具體實例及說明:

import random as r#利用繼承演示魚游動方向位置。class Fish():  #父類  def __init__(self):    self.x =r.randint(0,10)    self.y =r.randint(0,10)  def move(self):    self.x -=1  #一直向西移動    print("我的位置是:",self.x,self.y)classGoldfish(Fish): #子類  passclassCarp(Fish):   #子類  passclassSalmon(Fish):  #子類  passclassShark(Fish):  def __init__(self):  #這里重寫了__init__方法,就會覆蓋掉父類的方法了,用到super函數后就可以繼續(xù)使用父類的方法。  #super函數不用給定任何基類的名字(如下),它會一層層找出代碼所有父類里面對應的方法,要改變該類的繼承關系時只需修改這個類的父類就行就是括號里面的Fish。    super().__init__() #super().重寫的屬性或方法    self.hungry = True  def eat(self):    if self.hungry:      print("我要吃了。。。")      self.hungry = False    else:      print('好飽了。。。')>>> f=Fish()>>>f.move()我的位置是: -1 3>>>f.move()我的位置是: -2 3>>>g=Goldfish()>>>g.move()我的位置是: 4 4>>>s=Salmon()>>>s.move()我的位置是: 8 1>>>s.move()我的位置是: 7 1>>> s=Shark()>>>s.eat()我要吃了。。。>>>s.eat()好飽了。。。>>>s.move()我的位置是: 5 10  #這就是子類就可以使用父類的move()方法>>>s.move()我的位置是: 4 10

類和對象(4)

1.組合:一般把幾個沒有什么關系的類放在一起使用時通過組合類的方法。

例子:要求定義一個類,叫水池,水池里面有烏龜和魚。

class Turtle():  #定義烏龜類  def __init__(self,x):    self.num = xclassFish():  #定義魚類  def __init__(self,y):    self.num = yclassPool():   #定義水池類  def __init__(self,x,y):    self.turtle = Turtle(x)  #直接把需要的類在這里實例化就行了,組合實現    self.fish = Fish(y)  def print_num(self):    print("水池中總共有烏龜%d只,小魚%r條。"%(self.turtle.num,self.fish.num)>>> p =Pool(1,10)>>>p.print_num ()水池中總共有烏龜1只,小魚10條

這就是組合,組合就是把類的實例化放到一個新類里面,他就把舊類組合進去了。

組合一般就是說把幾個不是有繼承關系的、沒有直線關系的幾個類放在一起,如果要實現縱向關系的幾個類,就是繼承。

2.類、類對象、實例對象

Python,面向對象,類,對象

>>>class C(): #類,當類寫完后就變成了類對象    def x(self):       print("xaaa")>>> c =C()  #c是實例對象,C()是類對象>>> c.x()xaaa>>> c.x= 1  #實例對象初始化一個變量>>> c.x1>>> c.x()  #就不能繼續(xù)調用原來的方法了,同名會覆蓋掉類的方法Traceback (most recent call last): File"<pyshell#18>", line 1, in <module>  c.x()TypeError: 'int' object is not callable

所以:不要試圖在一個類里面定義所有的屬性和方法,應該利用繼承和組合機制;

用不同的詞性命名,如屬性名用名詞,方法名用動詞。

3.什么是綁定?

python嚴格要求方法需要有實例才能被調用,這種限制其實就是綁定。

>>>class CC:     #類    def setxy(self,x,y):       self.x = x       self.y = y    def printxy(self):       print(self.x,self.y)>>> dd= CC()   #實例對象,類對象>>>dd.__dict__  #查看實例對象所擁有的屬性{}>>>CC.__dict__  #查看類對象所擁有的屬性mappingproxy({'setxy':<function CC.setxy at 0x00000000031F9B70>, 'printxy': <functionCC.printxy at 0x00000000031F9BF8>, '__module__': '__main__', '__weakref__':<attribute '__weakref__' of 'CC' objects>, '__dict__': <attribute '__dict__'of 'CC' objects>, '__doc__': None})>>>dd.setxy (4,5)  #實例對象中傳入x,y>>>dd.__dict__  #實例對象就有屬性了,這兩個屬性緊屬于實例對象的,類對象中是沒有的{'y': 5, 'x': 4}     #類對象中是沒有實例對象傳入的,這歸功與綁定這個功能,self

為什么實例對象調用方法后類對象中沒有實例對象的屬性?

實例對象調用方法時,dd.setxy(dd,4,5) 實際上是這樣的,也就是(self.x = x;self.y = y)dd.x=4,dd.y=5,那么4,5存放在實例對象的空間,故這兩個屬性只屬于實例對象的。(實例對象調用類方法時,先把自己傳給self,self.x也就是dd.x.)

類對象與實例對象差別:

把類對象CC刪除后,del CC,再實例化就會報錯,但是已經實例化對象dd仍然可以調用類對象中的方法:

>>> delCC>>>dd.setxy (3,4)>>>dd.__dict__{'y': 4, 'x': 3}>>> dd =CC()Traceback (most recent call last): File"<pyshell#45>", line 1, in <module>  dd =CC()NameError: name 'CC' is not defined>>>dd.printxy ()3 4

為什么已經實例化對象dd仍然可以調用類對象中的方法?

類中定義的屬性是靜態(tài)變量,方法也一樣,就算類對象被刪除了,屬性和方法一樣存放在內存中,故實例對象仍然可以從內存中調用類的方法和屬性,除非程序退出。所以創(chuàng)建一個類后最好先實例化再使用類對象中的方法,不要直接利用類對象調用方法。

self.x  self相當于實例對象的名字,.x就是實例的空間了

希望本文所述對大家Python程序設計有所幫助。


注:相關教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 武邑县| 微山县| 左贡县| 咸阳市| 黑龙江省| 土默特右旗| 门源| 资中县| 洛扎县| 永州市| 甘泉县| 拉萨市| 尚志市| 昌图县| 徐水县| 梁平县| 邵东县| 临城县| 南川市| 樟树市| 黑龙江省| 德阳市| 沙田区| 忻州市| 安阳市| 静乐县| 江川县| 册亨县| 讷河市| 横山县| 晋城| 津南区| 曲水县| 融水| 潞西市| 道孚县| 青海省| 康定县| 镇平县| 兰溪市| 英山县|