Python入門——類、類對象、實例對象、與類和對象相關的內置函數


以下內容來自於網課學習筆記。

使用的環境:

  • 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章