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 #当c.ount+=10的是时候是生成了一个对象属性 count=10 以后再调用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严格要求方法需要有实例才能被调用,这种限制其实就是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.与类和对象相关的VBIF
1)issubclass(class,classinfo):class是classinfo的子类则返回True如果不是则抛出typeError,非严格检查,
一个类是自己的子类
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如果不是对象则永远返回False,如果第二个参数不是类或者由类对象组成的元祖,会抛出一个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的返回值,如果只当属性不存在则把default参数打印出来,否则将抛出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):设置对象中指定属性的值,如果属性不存在则用value设置
>>> 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):通过属性设置属性,设置一个属性x,这个属性的作用是去设置已经定义好的属性
fget:获得属性方法
fset:设属性方法
fdel:删除属性方法
以后执行c1.x会执行fget方法
以后执行c1.x=值会执行fset方法
以后执行del c1.x 会执行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'
网友评论