65.組合
要求定義一個類牍氛,叫水池蔚鸥,水池里要有烏龜和魚
class Turtle:
???def __init__(self,x):
???????self.num=x
class Fish:
???def __init__(self,x):
???????self.num=x
class Pool:
???def __init__(self,x,y):
???????self.turtle=Turtle(x)
???????self.fish=Fish(y)
???def print_num(self):
???????print('水池中總共有%d烏龜,%d小魚'%(self.turtle.num,self.fish.num))
運行代碼如下:
====================== RESTART: D:/python/3.5.1/Pool.py ======================
>>> pool=Pool(1,10)
>>> pool.fish.num
10
>>> pool.turtle.num
1
>>>
66.類秸弛、類對象和實例對象
>>> a=C()
>>> b=C()
>>> c=C()
>>> a.count
0
>>> b.count
0
>>> c.count
0
>>> a.count+=10
>>> a.count
10
>>> b.count
0
>>> C.count
0
>>> C.count+=100
>>> C.count
100
>>> c.count
100
>>> b.count
100
>>> a.count
10
#
類定義? ? ? ? ? C?
類對象? ? ? ? ? C
實例對象? a? ? b? c? #當(dāng)c.ount+=10的是時候是生成了一個對象屬性 count=10 以后再調(diào)用c.count則輸出是10谊却,因為對象屬性把類屬性給覆蓋了
67.屬性與方法名字相同則屬性會覆蓋方法
>>> class C:
???def x(self):
??????print('X-man!')
>>> c=C()
>>> c.x()
X-man!
>>> c.x=1
>>> c.x
1
>>> c.x()
Traceback (most recent call last):# c的對象屬性x把c的方法x()給覆蓋掉了
?File "", line 1, in
???c.x()
TypeError: 'int' object is not callable
68.到底什么是綁定冰沙?
python嚴(yán)格要求方法需要有實例才能被調(diào)用,這種限制其實就是python所謂的綁定概念
>>> class CC:
???def setxy(self,x,y):
??????self.x=x
??????self.y=y
???def printXY(self):
??????print(self.x,self.y)
>>> dd=CC()
>>> dd.__dict__
{}
>>> CC.__dict__
mappingproxy({'__module__': '__main__', 'setxy': , '__weakref__': , '__dict__': , 'printXY': , '__doc__': None})
>>> dd.setxy(4,5)
>>> dd.__dict__
{'y': 5, 'x': 4}
>>> CC.__dict__
mappingproxy({'__module__': '__main__', 'setxy': , '__weakref__': , '__dict__': , 'printXY': , '__doc__': None})
>>> del CC
>>> cc=CC()
Traceback (most recent call last):
?File "", line 1, in
???cc=CC()
NameError: name 'CC' is not defined
>>> dd.printXY()
4 5
69.與類和對象相關(guān)的VBIF
1)issubclass(class花盐,classinfo):class是classinfo的子類則返回True如果不是則拋出typeError羡滑,非嚴(yán)格檢查,
一個類是自己的子類
classinfo可以是類對象組成的元組算芯,只要class是其中任何一個候選類的子類柒昏,則返回True
>>> class A:
???pass
>>> class B(A):
???pass
>>> issubclass(B,A)
True
>>> issubclass(B,B)
True
>>> issubclass(B,object)
True
>>> class C:
???pass
>>> issubclass(B,C)
False
2)isinstance(object,classinfo):檢查一個實例對象是否屬于一個類,boject是一個實例對象熙揍,classinfo是一個類(這個也可以是一個候選類組成的元組)职祷,如果是則返回True,第一個object如果不是對象則永遠(yuǎn)返回False届囚,如果第二個參數(shù)不是類或者由類對象組成的元祖有梆,會拋出一個TypeError的異常
>>> class A:
???pass
>>> class B(A):
???pass
>>> issubclass(B,A)
True
>>> issubclass(B,B)
True
>>> issubclass(B,object)
True
>>> class C:
???pass
>>> issubclass(B,C)
False
>>>
>>>
>>> b1=B()
>>> isinstance(b1,B)
True
>>> isinstance(b1,A)
True
>>> isinstance(b1,C)
False
>>> isinstance(b1,(A,B))
True
3)hasattr(object,name):測試一個對象是否由指定的屬性,對象就是boject意系,name就是屬性名泥耀,name需要用引號
>>> class C:
???def __init__(self,x=0):
??????self.x=x
>>> c1=C()
>>> hasattr(c1,'x')
True
>>> hasattr(c1,x)
Traceback (most recent call last):
?File "", line 1, in
???hasattr(c1,x)
NameError: name 'x' is not defined
4)getattr(object,name[,default]):返回對象object指定的屬性name的返回值,如果只當(dāng)屬性不存在則把default參數(shù)打印出來蛔添,否則將拋出attributeError異常
>>> class C:
???def __init__(self,x=0):
??????self.x=x
>>> c1=C()
>>> hasattr(c1,'x')
True
>>> hasattr(c1,x)
Traceback (most recent call last):
?File "", line 1, in
???hasattr(c1,x)
NameError: name 'x' is not defined
>>> getattr(c1,'x')
0
>>> getattr(c1,'y')
Traceback (most recent call last):
?File "", line 1, in
???getattr(c1,'y')
AttributeError: 'C' object has no attribute 'y'
>>> getattr(c1,'y','您訪問的屬性不存在')
'您訪問的屬性不存在'
5)setattr(object,name,value):設(shè)置對象中指定屬性的值痰催,如果屬性不存在則用value設(shè)置
>>> setattr(c1,'y',19)
>>> getattr(c1,'y')
19
6)delattr(object,name)刪除對象object中指定的name屬性
>>> delattr(c1,'y')
>>> getattr(c1,'y','您訪問的屬性不存在')
'您訪問的屬性不存在'
>>> delattr(c1,'c')
Traceback (most recent call last):
?File "", line 1, in
???delattr(c1,'c')
AttributeError: c
7)property(fget=None,fset=None,fdel=None,doc=None):通過屬性設(shè)置屬性作郭,設(shè)置一個屬性x陨囊,這個屬性的作用是去設(shè)置已經(jīng)定義好的屬性
fget:獲得屬性方法
fset:設(shè)屬性方法
fdel:刪除屬性方法
以后執(zhí)行c1.x會執(zhí)行fget方法
以后執(zhí)行c1.x=值會執(zhí)行fset方法
以后執(zhí)行del c1.x 會執(zhí)行fdel方法
>>> class C:
???def __init__(self,size=10):
??????self.size=size
???def getSize(self):
??????return self.size
???def setSize(self,value):
??????self.size=value
???def delSize(self):
??????del self.size
???x=property(getSize,setSize,delSize)
>>> c1=C()
>>> c1.getSize()
10
>>> c1.x
10
>>> c1.x=18
>>> c1.x
18
>>> c1.size
18
>>> del c1.x
>>> c1.size
Traceback (most recent call last):
?File "", line 1, in
???c1.size
AttributeError: 'C' object has no attribute 'size'