Python基礎(chǔ) | 類相關(guān)

Python作為一種動(dòng)態(tài)語(yǔ)言,有自己的特性。學(xué)習(xí)了部分關(guān)于Python中類相關(guān)的內(nèi)容之后,總結(jié)幾點(diǎn)小知識(shí),更好的溫習(xí)。

一、創(chuàng)建大量實(shí)例節(jié)省內(nèi)存

  • Python支持實(shí)例動(dòng)態(tài)增加屬性,大量實(shí)例占據(jù)大量?jī)?nèi)存空間,優(yōu)化方式是使用slots屬性,禁止其動(dòng)態(tài)綁定參數(shù)行為,有效優(yōu)化內(nèi)存空間
class Player1(object):
    def __init__(self,uid,name,status=0,level=1):
        self.uid = uid
        self.name = name
        self.status = status
        self.level = level
    
class Player2(object):
    # 聲明出僅有的四個(gè)屬性,不能在運(yùn)行中動(dòng)態(tài)綁定屬性
    __slots__=['uid','name','status','level']
    def __init__(self,uid,name,status=0,level=1):
        self.uid = uid
        self.name = name
        self.status = status
        self.level = level

二、創(chuàng)建可管理的對(duì)象屬性

  • Java中使用get和set方法訪問(wèn)和設(shè)置屬性,Python支持動(dòng)態(tài)綁定屬性,這種方式不能保證參數(shù)類型的有效性,可以在set方法中進(jìn)行類型驗(yàn)證
  • 對(duì)于Python中的get和set方法,是否可以像訪問(wèn)屬性一樣簡(jiǎn)單呢?可以使用其內(nèi)置函數(shù)property,實(shí)現(xiàn)函數(shù)像屬性一樣簡(jiǎn)單訪問(wèn)
from math import pi
class Circle(object):
    def __init__(self,radius):
        self.radius = radius
    def getRadius(self):
        # 可以對(duì)輸入的數(shù)據(jù)進(jìn)行四舍五入
        return round(self.radius,2)
    # 使用方法設(shè)置后,屬性類型可以確定
    def setRadius(self,value):
        if not isinstance(value,(int,float)):
            raise ValueError('錯(cuò)誤類型')
        self.radius = value
    def getAreas(self):
        return self.radius ** 2 * pi
    # 用于快速訪問(wèn)方法屬性
    R = property(getRadius,setRadius)

c = Circle()
c.R
c.R = 13

三、描述符對(duì)實(shí)例屬性做類型檢查

  • Python動(dòng)態(tài)綁定屬性時(shí),是否可以對(duì)其要添加的類型進(jìn)行檢查呢?可以基于描述符對(duì)動(dòng)態(tài)綁定的屬性進(jìn)行類型檢查
class Attr(object):
    def __init__(self,name,type_):
        self.name = name
        self.type_ = type_
           
    def __get__(self,instance,cls):
        return instance.__dict__[self.name]
    
    def __set__(self,instance,value):
        if not isinstance(value,self.type_):
            raise TypeError("required type: %s " % self.type_)
        instance.__dict__[self.name] = value
        
    def __delete__(self,instance):
        del instance.__dict__[self.name]
        
class Person(object):
    name = Attr('name',str)
    age = Attr('age',int)
    email = Attr('email',str)

四、環(huán)形引用的對(duì)象銷毀

  • Python中對(duì)象的銷毀基于引用計(jì)數(shù),如果存在環(huán)形引用情況,往往難以銷毀對(duì)象,可以使用weakref包中的弱引用來(lái)實(shí)現(xiàn)
import weakref
class Data(object):
    def __init__(self,value,own):
         self.value = value
         self.own = weakref.ref(own)
    def __str__(self):
        return "%s's data,value is %s" %(self.own(),self.value)
    def __del__(self):
        print ('in Data del')

class Node(object):
    def __init__(self,value):
        self.value = Data(value,self)
    def __del__(self):
        print ('in Node del')

今年的六月,相對(duì)還是很溫和的,相比于之前年份的六月,只能說(shuō)以前太殘忍。趁著機(jī)會(huì),伴著微風(fēng),開(kāi)心向前。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容