最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python面向?qū)ο笾惡蛯?duì)象實(shí)例詳解

 更新時(shí)間:2018年12月10日 08:39:24   作者:oOo右右  
這篇文章主要介紹了Python面向?qū)ο笾惡蛯?duì)象,結(jié)合實(shí)例形式詳細(xì)分析了Python面向?qū)ο笙嚓P(guān)的繼承、多態(tài)、類及對(duì)象等概念、原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Python面向?qū)ο笾惡蛯?duì)象。分享給大家供大家參考,具體如下:

類和對(duì)象(1)

對(duì)象是什么?

對(duì)象=屬性(靜態(tài))+方法(動(dòng)態(tài));

屬性一般是一個(gè)個(gè)變量;方法是一個(gè)個(gè)函數(shù);

#類的屬性 就是 類變量

#實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類。

例子:

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

面向?qū)ο蟮奶卣鳎?/strong>

oo = Object Oriented(面向?qū)ο螅?/code>

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

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

封裝后就可以直接調(diào)用里面的方法了?。?!

2.繼承

 子類自動(dòng)共享父類之間數(shù)據(jù)和方法的機(jī)制。

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

3.多態(tài)

不同對(duì)象對(duì)同一方法響應(yīng)不同行動(dòng)。就是名字一樣方法不一樣:

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

類和對(duì)象(2)

self是什么?

如果把類當(dāng)做圖紙,那么由類實(shí)例化后的對(duì)象就是可以住人的房子。self就相當(dāng)于房子的門牌號(hào),由self就可以找到對(duì)象。

一個(gè)類可以生成無(wú)數(shù)個(gè)對(duì)象,對(duì)象之間都很相似,因?yàn)槎际莵?lái)源與類的方法屬性。當(dāng)對(duì)象方法被調(diào)用時(shí),對(duì)象就會(huì)將自己作為第一個(gè)參數(shù)傳給self,python就是根據(jù)self知道哪一個(gè)對(duì)象在調(diào)用方法;

>>>class Ball():
    def setname(self,name):
       self.name=name
    def kick (self):
       print("我叫%r,誰(shuí)踢我"%self.name)
>>>a=Ball()  實(shí)例化生成a對(duì)象
>>>a.setname('a') 調(diào)用方法設(shè)名為a
>>>b=Ball()
>>>b.setname('b')
>>>c=Ball()
>>>c.setname()
>>>a.kick ()  通過(guò)self知道是哪個(gè)對(duì)象調(diào)用kick方法
我叫'a',誰(shuí)踢我
>>>b.kick()
我叫'b',誰(shuí)踢我

python的魔法方法:

__init__(self) 這個(gè)是構(gòu)造方法。

實(shí)例化一個(gè)對(duì)象時(shí),這個(gè)方法就會(huì)在對(duì)象創(chuàng)建時(shí)(實(shí)例化類就是創(chuàng)建對(duì)象)自動(dòng)調(diào)用。實(shí)例化時(shí)就會(huì)調(diào)用__init__(self)這個(gè)方法。

實(shí)例化對(duì)象是可以傳入?yún)?shù)的,這些參數(shù)被傳入init方法中,可通過(guò)重寫方法來(lái)自定義對(duì)象初始化操作。

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

公有和私有:

公有和私有數(shù)據(jù)類型。python中對(duì)象的屬性和方法都是公開(kāi)的都是公有的通過(guò).操作符訪問(wèn)。

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

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

類和對(duì)象(3):繼承

語(yǔ)法:

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!

注意:如果子類中定義與父類同名的方法或?qū)傩?,則會(huì)自動(dòng)覆蓋父類對(duì)應(yīng)的方法或?qū)傩浴?/p>

例子:

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

super()函數(shù):解決了子類就算重寫父類方法或?qū)傩匀匀豢梢岳^續(xù)使用父類的方法和屬性。

具體實(shí)例及說(shuō)明:

import random as r
#利用繼承演示魚(yú)游動(dòng)方向位置。
class Fish():  #父類
  def __init__(self):
    self.x =r.randint(0,10)
    self.y =r.randint(0,10)
  def move(self):
    self.x -=1  #一直向西移動(dòng)
    print("我的位置是:",self.x,self.y)
classGoldfish(Fish): #子類
  pass
classCarp(Fish):   #子類
  pass
classSalmon(Fish):  #子類
  pass
classShark(Fish):
  def __init__(self):  #這里重寫了__init__方法,就會(huì)覆蓋掉父類的方法了,用到super函數(shù)后就可以繼續(xù)使用父類的方法。
  #super函數(shù)不用給定任何基類的名字(如下),它會(huì)一層層找出代碼所有父類里面對(duì)應(yīng)的方法,要改變?cè)擃惖睦^承關(guān)系時(shí)只需修改這個(gè)類的父類就行就是括號(hào)里面的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

類和對(duì)象(4)

1.組合:一般把幾個(gè)沒(méi)有什么關(guān)系的類放在一起使用時(shí)通過(guò)組合類的方法。

例子:要求定義一個(gè)類,叫水池,水池里面有烏龜和魚(yú)。

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

這就是組合,組合就是把類的實(shí)例化放到一個(gè)新類里面,他就把舊類組合進(jìn)去了。

組合一般就是說(shuō)把幾個(gè)不是有繼承關(guān)系的、沒(méi)有直線關(guān)系的幾個(gè)類放在一起,如果要實(shí)現(xiàn)縱向關(guān)系的幾個(gè)類,就是繼承。

2.類、類對(duì)象、實(shí)例對(duì)象

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

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

用不同的詞性命名,如屬性名用名詞,方法名用動(dòng)詞。

3.什么是綁定?

python嚴(yán)格要求方法需要有實(shí)例才能被調(diào)用,這種限制其實(shí)就是綁定。

>>>class CC:     #類
    def setxy(self,x,y):
       self.x = x
       self.y = y
    def printxy(self):
       print(self.x,self.y)
>>> dd= CC()   #實(shí)例對(duì)象,類對(duì)象
>>>dd.__dict__  #查看實(shí)例對(duì)象所擁有的屬性
{}
>>>CC.__dict__  #查看類對(duì)象所擁有的屬性
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)  #實(shí)例對(duì)象中傳入x,y
>>>dd.__dict__  #實(shí)例對(duì)象就有屬性了,這兩個(gè)屬性緊屬于實(shí)例對(duì)象的,類對(duì)象中是沒(méi)有的
{'y': 5, 'x': 4}     #類對(duì)象中是沒(méi)有實(shí)例對(duì)象傳入的,這歸功與綁定這個(gè)功能,self

為什么實(shí)例對(duì)象調(diào)用方法后類對(duì)象中沒(méi)有實(shí)例對(duì)象的屬性?

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

類對(duì)象與實(shí)例對(duì)象差別:

把類對(duì)象CC刪除后,del CC,再實(shí)例化就會(huì)報(bào)錯(cuò),但是已經(jīng)實(shí)例化對(duì)象dd仍然可以調(diào)用類對(duì)象中的方法:

>>> 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

為什么已經(jīng)實(shí)例化對(duì)象dd仍然可以調(diào)用類對(duì)象中的方法?

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

self.x  self相當(dāng)于實(shí)例對(duì)象的名字,.x就是實(shí)例的空間了

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Python 中的參數(shù)傳遞、返回值、淺拷貝、深拷貝

    Python 中的參數(shù)傳遞、返回值、淺拷貝、深拷貝

    這篇文章主要介紹了Python 中的參數(shù)傳遞、返回值、淺拷貝、深拷貝,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • 解決TensorFlow程序無(wú)限制占用GPU的方法

    解決TensorFlow程序無(wú)限制占用GPU的方法

    這篇文章主要介紹了解決TensorFlow程序無(wú)限制占用GPU的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • python實(shí)現(xiàn)用戶管理系統(tǒng)

    python實(shí)現(xiàn)用戶管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)用戶管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 在Python的框架中為MySQL實(shí)現(xiàn)restful接口的教程

    在Python的框架中為MySQL實(shí)現(xiàn)restful接口的教程

    這篇文章主要介紹了在Python的框架中為MySQL實(shí)現(xiàn)restful接口的教程,文中的示例基于Flask和Django框架,需要的朋友可以參考下
    2015-04-04
  • python利用 keyboard 庫(kù)記錄鍵盤事件

    python利用 keyboard 庫(kù)記錄鍵盤事件

    這篇文章主要介紹了python利用 keyboard 庫(kù)記錄鍵盤事件,幫助大家更好的利用python進(jìn)行辦公,感興趣的朋友可以了解下
    2020-10-10
  • 淺談python配置與使用OpenCV踩的一些坑

    淺談python配置與使用OpenCV踩的一些坑

    下面小編就為大家分享一篇淺談python配置與使用OpenCV踩的一些坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python數(shù)據(jù)類型最全知識(shí)總結(jié)

    Python數(shù)據(jù)類型最全知識(shí)總結(jié)

    學(xué)習(xí)一門語(yǔ)言,往往都是從Hello World開(kāi)始. 但是筆者認(rèn)為,在一個(gè)黑框框中輸出一個(gè)“你好,世界”并沒(méi)有什么了不起,要看透事物的本質(zhì),熟悉一門語(yǔ)言,就要了解其底層,就是我們常常說(shuō)的基礎(chǔ),本篇從python中的數(shù)據(jù)類型開(kāi)始,需要的朋友可以參考下
    2021-05-05
  • selenium+python設(shè)置爬蟲(chóng)代理IP的方法

    selenium+python設(shè)置爬蟲(chóng)代理IP的方法

    這篇文章主要介紹了selenium+python設(shè)置爬蟲(chóng)代理IP的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 使用 Python 清理收藏夾里已失效的網(wǎng)站

    使用 Python 清理收藏夾里已失效的網(wǎng)站

    這篇文章主要介紹了用 Python 清理收藏夾里已失效的網(wǎng)站,本文通過(guò)截圖實(shí)例代碼的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Django實(shí)現(xiàn)跨域的2種方法

    Django實(shí)現(xiàn)跨域的2種方法

    這篇文章主要介紹了Django實(shí)現(xiàn)跨域的2中方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07

最新評(píng)論

伊宁县| 资溪县| 巴马| 金坛市| 贡觉县| 霍邱县| 郁南县| 体育| 苍梧县| 山阳县| 连山| 庆阳市| 肃南| 襄城县| 瑞安市| 滕州市| 宜州市| 西华县| 诏安县| 刚察县| 平陆县| 永德县| 武清区| 三亚市| 鲁山县| 和田市| 神池县| 南岸区| 吉安市| 桐梓县| 新疆| 神池县| 龙海市| 宜章县| 溆浦县| 林芝县| 宁陕县| 沙田区| 治县。| 双牌县| 灌云县|