电竞比分网-中国电竞赛事及体育赛事平台

分享

python的類和對(duì)象

 quasiceo 2017-08-14

1、類的繼承(直接在類名后面括號(hào)里面寫入要繼承的類名

  

  

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

  

解決上述問題的方法:

  a、調(diào)用未綁定的父類方法

    

  b、使用super函數(shù)(優(yōu)點(diǎn)是不用給出任何基類的名字,python會(huì)自動(dòng)一層層找到基類中對(duì)應(yīng)的方法)

  多重繼承(容易代碼混亂,應(yīng)盡量避免使用

    

  

  出現(xiàn)上述情況的時(shí)候,使用繼承和多重繼承都不合適,于是使用組合:

    

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

    

  類中的方法名與屬性名重名時(shí),類將被屬性覆蓋:

    

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

  1、issubclass(class, classinfo)

    a、一個(gè)類被認(rèn)為是其自身的子類

    b、classinfo可以是類對(duì)象組成的元組,只要class與其中任何一個(gè)候選子   類,則返回True

  2、isinstance(object,classinfo)

    a、如果第一個(gè)參數(shù)不是對(duì)象,則永遠(yuǎn)返回False

    b、如果第二個(gè)參數(shù)不是類或者由類對(duì)象組成的元組,會(huì)拋出一個(gè)TypeError  異常。

  3、hasattr(object,name):測試一個(gè)對(duì)象是否有指定的屬性

  4、getattr(object, name[, default]):返回對(duì)象指定的屬性值

  5、setattr(object,name,value):設(shè)置指定屬性的值

  6、delattr(object,name):刪除對(duì)象中指定的屬性,如果屬性不存在拋出  異常。

2、多態(tài)(不同的對(duì)象對(duì)同一類方法的不同響應(yīng)

3、self(對(duì)象的方法中會(huì)傳遞一個(gè)self參數(shù)

  由一個(gè)類可以生成多個(gè)對(duì)象,對(duì)象之間都極為相似,來源于同一個(gè)類,不同的對(duì)象調(diào)用方法時(shí)傳遞self參數(shù)告訴python當(dāng)前是哪個(gè)對(duì)象調(diào)用方法了。

  

4、python的魔法方法(總是被雙下劃線包圍)

  1、__init__(self, param1, param2, ...):類似于java中的構(gòu)造方法

  ps:init方法不能有返回值

  2、__new__(cls[,...]):對(duì)象實(shí)例化時(shí)調(diào)用的方法,返回一個(gè)類對(duì)象

    

  3、__del__(self):當(dāng)對(duì)象被銷毀的時(shí)候(垃圾回收機(jī)制)自動(dòng)調(diào)用

5、python定義私有屬性或方法

  在python中定義私有的變量只需要在變量名或函數(shù)名前面加上"__"兩個(gè)下劃線,那么這個(gè)函數(shù)或變量就會(huì)變成私有的了。

  

ps:python將雙下劃線開頭的名字進(jìn)行了改編,改成"_類名_屬性名/方法名"

  

6、property方法

  

 

7、描述符(property的原理)

  描述符:就是將某種特殊類型的類的實(shí)例指派給另一個(gè)類的屬性。

  特殊類是指至少實(shí)現(xiàn)以下三個(gè)方法中的一個(gè)方法的類:

    a、__get__(self, instance, owner):用于訪問屬性,它返回屬性的值

    b、__set__(self, instance, value):將在屬性分配操作中調(diào)用,不返回任何內(nèi)容

    c、__delete__(self, instance):控制刪除操作,不返回任何內(nèi)容

    

 

  自己實(shí)現(xiàn)一個(gè)property類,完成描述符的功能:

#特殊的類要實(shí)現(xiàn)__get__、__set__、__delete__三個(gè)方法
class MyProperty:
  def __init__(self, fget=None, fset=None, fdel=None):
    self.fget = fget
    self.fset = fset
    self.fdel = fdel
  def __get__(self, instance, owner):
    return self.fget(instance)
  def __set__(self, instance, value):
    self.fset(instance, value)
  def __delete__(self, instance):
    self.fdel(instance)

class C:
  def __init__(self):
    self._x = None
  def getX(self):
    return self._x
  def setX(self, value):
    self._x = value
  def delX(self):
    del self._x
x = MyProperty(getX, setX, delX)
c = C()
c.x = 10
print(c.x)
print(c._x)

 

  應(yīng)用舉例:

    

 

#定義攝氏度類
class Cal:
def __init__(self, value=26.0):
self.temp = float(value)
def __get__(self, instance, owner):
return self.temp
def __set__(self, instance, value):
self.temp = float(value)
def __delete__(self, instance):
del self.temp
#定義華氏度類
class Has:
def __get__(self, instance, owner):
return instance.cal * 1.8 + 32
def __set__(self, instance, value):
instance.cal = (float(value)-32)/1.8
#定義溫度類
class Temp:
cal = Cal() #實(shí)例化攝氏度類
has = Has() #實(shí)例化華氏度類

temp1 = Temp()
print(temp1.cal)
print(temp1.has)
temp1.has = 100
print(temp1.cal)

 

8、對(duì)象的屬性訪問

  a、__getattr__(self, name):定義當(dāng)一個(gè)用戶試圖獲取一個(gè)不存在的屬性時(shí)的行為

  b、__getattribute__(self, name):定義當(dāng)該類的屬性被訪問時(shí)的行為

  c、__setattr__(self, name, value):定義當(dāng)一個(gè)屬性被設(shè)置時(shí)的行為

  d、__delattr__(self, name):定義當(dāng)一個(gè)屬性被刪除時(shí)的行為

  

9、注意魔法方法的死循環(huán)

  

  屬性賦值時(shí),默認(rèn)自動(dòng)調(diào)用__setattr__方法

  

  解決方法:

    a、調(diào)用基類的setattr方法(優(yōu)選)

      

      class Rectangle:
        def __init__(self, width=0, height=0):
          self.width = width #矩形的長
          self.height = height #矩形的寬
        def __setattr__(self, name, value):
          if name == "square":
            self.width = value
            self.height = value
          else:
            super().__setattr__(name, value)
        def getArea(self): #獲得矩形的面積
          return self.width * self.height
      r = Rectangle(4, 5)
      print(r.getArea())
      r.square = 10
      print(r.width)
      print(r.height)
      print(r.getArea())

    b、使用對(duì)象的特殊屬性dict進(jìn)行賦值

      

 


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多