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)心向前。