Python基础笔记-10

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'

你可能感兴趣的:(Python基础笔记-10)