文章目錄
以下內容來自於網課學習筆記。
使用的環境:
- Window10+64位操作系統
- PyCharm+Python3.7
一、類、類對象、實例對象
a、b、c並不影響類定義和類對象內容。但是類對象可以影響實例對象。
class C:
# 公有變量
count=0
# 四個實例對象
a=C()
b=C()
c=C()
d=C()
print(a.count)
print(b.count)
print(c.count)
print(d.count)
# 對count進行了賦值操作,覆蓋了類中的count
c.count+=10
print(a.count)
print(b.count)
print(c.count)
print(d.count)
# 類對象
# 直接操作原類中的變量,實例變量的count會變化
C.count+=100
print(a.count)
print(b.count)
# 由於c實例對象已經操作過count,所以原count已經被覆蓋了
print(c.count)
print(d.count)
0
0
0
0
0
0
10
0
100
100
10
100
- 不要試圖在一個類裏邊定義出所有能想到的特性和方法,應該利用繼承和組合機制來進行擴展。
- 用不同的詞性命名,如屬性名用名詞,方法名用動詞。
class C:
def x(self):
print("X-man")
c=C()
c.x()
# 創建一個x屬性,屬於實例對象c
c.x=1
print(c.x)
# 不能再次調用,因爲屬性名與方法名相同,方法被覆蓋
c.x()
二、綁定
Python嚴格要求方法需要有實例才能被調用,這種限制其實就是Python所謂的綁定概念。
class HH:
def setXY(self,x,y):
self.x=x
self.y=y
def printXY(self):
print(self.x,self.y)
hh=HH()
print(hh.__dict__)
print(HH.__dict__)
hh.setXY(3,5)
hh.printXY()
print(hh.__dict__)
print(HH.__dict__)
del HH
# 存在在內存中
hh.printXY()
# 失敗:HH已經不存在了
hhh=HH()
三、與類和對象相關的內置函數
1. issubclass(class, classinfo)
如果class是classinfo的子類,返回True。
否則,返回Error
class A:
pass
class B(A):
pass
class C:
pass
print(issubclass(B,A))
print(issubclass(B,B))
print(issubclass(B,object))
print(issubclass(B,C))
2. isinstance(object,classinfo)
檢查一個實例對象是否屬於一個類。
第一個參數:待檢查的實例對象
第二個參數:類,可以是一個元組,包含多個類。
若第一個參數不是對象,則永遠返回False。
若第二個參數不是類或者由類對象組成的元組,會拋出一個TypeError異常。
class A:
pass
class B(A):
pass
class C:
pass
b1=B()
print(isinstance(b1,B))
print(isinstance(b1,A))
print(isinstance(b1,C))
print(isinstance(A,B))
3. hasattr(object,name)
是否一個對象內包含指定屬性。
第一個參數: 對象
第二個參數:屬性名
class A:
def __init__(self,x=0,y=3):
self.x=x
self.z=y
a=A()
print(hasattr(a,"x"))
print(hasattr(a,"y"))
print(hasattr(a,"z"))
print(hasattr(A,"x"))
print(hasattr(A,"y"))
print(hasattr(A,"z"))
print(hasattr(a,x))
4. getattr(object,name[,default])
返回對象指定的屬性值。
第一個參數:對象名
第二個參數:屬性名
可選參數default: 出錯的提示信息。
若指定的屬性不存在:
- 若設置了default,則打印default的值
- 若沒有設置default值,則打印
AttributeError
。
class A:
def __init__(self,x=0,y=3):
self.x=x
self.z=y
a=A()
print(getattr(a,"x"))
print(getattr(a,"z"))
print(getattr(a,"y","屬性y不存在!"))
print(getattr(a,"y"))
5. setattr(object,name,value)
設置對象中指定屬性的值。若指定的屬性不存在,則在對象中加入此屬性。
第一個參數:對象名
第二個參數:屬性名
第三個參數:屬性值
class A:
def __init__(self,x=0,y=3):
self.x=x
self.z=y
a=A()
setattr(a,"x",10)
setattr(a,"z","hello")
print(getattr(a,"x"))
print(getattr(a,"z"))
print(getattr(a,"y","屬性y不存在!"))
setattr(a,"y",[3,4,5])
print(getattr(a,"y","屬性y不存在!"))
6. delattr(object,name)
刪除對象中指定的屬性。
第一個參數:對象名
第二個參數:屬性名
若屬性不存在,則會返回AttributeError
錯誤。
class A:
def __init__(self,x=0,y=3):
self.x=x
self.z=y
a=A()
print("x:"+str(getattr(a,"x")))
print("y:"+str(getattr(a,"z")))
setattr(a,"y",[3,4,5])
print("y:"+str(getattr(a,"y","屬性y不存在!")))
delattr(a,"y")
print(getattr(a,"y","屬性y不存在!"))
7. property(fget=None,fset=None,fdel=None,doc=None)
通過屬性設置屬性。
第一個參數:傳入獲取屬性的方法
第二個屬性:傳入設置屬性的方法
第三個參數:傳入刪除屬性的方法
第四個參數:
class WW:
def __init__(self,size=10):
self.size=size
def getSize(self):
print("size:"+str(self.size))
def setSize(self,value):
self.size=value
def delSize(self):
del self.size
x=property(getSize,setSize,delSize)
ww=WW()
ww.getSize()
ww.x
ww.x="WaitFoF"
ww.x
print(ww.size)
ww.getSize()
del ww.x
ww.size