美文网首页
Python基础笔记-10

Python基础笔记-10

作者: 杨大菲 | 来源:发表于2018-01-21 17:58 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/idrqaxtx.html