美文网首页
类的继承笔记

类的继承笔记

作者: stalker丨 | 来源:发表于2019-04-02 19:12 被阅读0次

    特征:封装,继承,多态

    对象的方法 self 参数 (相当于c++中的this指针)

    >>> class Ball:

    def setName(self,name):

    self.name = name

    def kick(self):

    print("我叫%s" % self.name)

    >>> a = Ball()

    >>> a.setName('球A')

    >>> b = Ball()

    >>> b.setName('球B')

    >>> c = Ball()

    >>> c.setName('土豆')

    >>> a.kick()

    我叫球A

    >>> b.kick()

    我叫球B

    >>> c.kick()

    我叫土豆

    ------------------------------------------------------------

    公有和私有  在对象中加入 __ 会变成私有,私有对象不能被直接调用出来

    >>> class Person:

    __name = "stlaker"

    >>> p=Person()

    >>> p.__name  #直接调用会调用失败

    Traceback (most recent call last):

      File "<pyshell#36>", line 1, in <module>

        p.__name

    AttributeError: 'Person' object has no attribute '__name'

    >>> class Person:

    __name = "stlaker"

    def getName(self):

    return self.__name

    >>> p=Person()

    >>> p.getName()

    'stlaker'

    >>> p._Person__name

    'stlaker'

    ------------------------------------------------------------

    继承:

    子类   基类,父类或超类

    class DerivedClassName(BaseClassName):

    ...

    >>> class Child(parent):

    pass

    >>> p = parent()

    >>> p.hello()

    正在调用父类方法

    >>> c  = Child()

    >>> c.hello()

    正在调用父类方法

    #如果子类中定义与父类同名的方法或属性,则会自动覆盖

    #父类对应的方法或属性

    >>> class Child(parent):

    def hello(self):

    print("正在调用子类的方法")

    >>> c=Child()

    >>> c.hello()

    正在调用子类的方法

    #在继承父类的方法后,如果对__init__进行了重载 如果需要使用父类的__init__可以使用:

    #-调用未绑定的父类方法

    #-调用super函数

    具体查看 类的继承.py

    继承可以多重继承:

    class DerivedClassName(Base1,Base2,Base3,):

    #多重继承

    class Base1:

        def foo1(self):

            print("1")

    class Base2:

        def foo2(self):

            print("2")

    class C(Base1,Base2):

        pass

    >>>c=C()

    >>>c.foo1()

    1

    >>>c.foo2()

    2

    ------------------------------------------------------------

    #组合

    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))

    #>>> pool = Pool(1,10)

    #>>> pool.print_num()

    #池里总共有乌龟 1 只,鱼 10 条

    -不要试图在一个类里面定义出所有能想到的特性和方法,应该利用继承和

    组合机制来进行扩展

    -用不同的词性命名,如属性名用名词,方法名用动词

    -python严格要求方法需要有实例才能被调用,这种限制其实就是python所谓的绑定概念

    >>> class CC:

    def setXY(self,x,y):

    self.x = x

    self.y = y

    >>> 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': <function CC.setXY at 0x0000020DCDE93488>, 'printXY': <function CC.printXY at 0x0000020DCDE93510>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None})

    >>> dd.setXY(4,5)

    >>> dd.__dict__

    {'x': 4, 'y': 5}

    >>> CC.__dict__

    mappingproxy({'__module__': '__main__', 'setXY': <function CC.setXY at 0x0000020DCDE93488>, 'printXY': <function CC.printXY at 0x0000020DCDE93510>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None})

    (实例化相当于dd.setXY(dd,4,5))

    -类中定义的属性是静态对象,即时类被删除,实例化的对象也能使用

    ------------------------------------------------------

    相关的BIF(内置函数)    (object:指对象)

    1.一个类被认为是其自身的子类

    issubclass(class,classinfo)

    返回 True 或 False

    2.检查一个实例对象是否属于一个类

    - 如果第一个参数不是一个对象,则永远返回false

    - 如果第二个参数不是类或者由类对象组成的元祖,会抛出一个TypeError异常

    isinstance(object,classinfo)

    返回 True 或 False

    3.访问对象的属性

    - attr = attribute:属性

    hasattr(object,name)

    返回对象指定的属性值

    getattr(object,name[,default])

    设置对象中指定的值,如果不存在,则直接创建并赋值

    setattr(object,name,value)

    删除对象中指定的属性,如果对象不存在,则抛出异常

    delattr(object,name)

    >>> class A:

    pass

    >>> class B(A):

    pass

    >>> issbuclass(B,A)

    Traceback (most recent call last):

      File "<pyshell#35>", line 1, in <module>

        issbuclass(B,A)

    NameError: name 'issbuclass' is not defined

    >>> 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

    >>> class C:

    def __init__(self,x=0)

    SyntaxError: invalid syntax

    >>> class C:

    def __init__(self,x=0):

    self.x = x

    >>> c1 = C()

    >>> hasattr(c1,'x')

    True

    >>> getattr(c1,'x')

    0

    >>> getattr(c1,'y')

    Traceback (most recent call last):

      File "<pyshell#56>", line 1, in <module>

        getattr(c1,'y')

    AttributeError: 'C' object has no attribute 'y'

    >>> getattr(c1,'y','您所访问的内容不存在')

    '您所访问的内容不存在'

    >>> setattr(c1,'y',20)

    >>> getattr(c1,'y')

    20

    >>> delattr(c1,'y')

    >>> delattr(c1,'y')

    Traceback (most recent call last):

      File "<pyshell#61>", line 1, in <module>

        delattr(c1,'y')

    AttributeError: y

    通过属性来设置属性

    获得属性的方法  设置属性的方法  删除属性的方法

    property(fget = None , fset=None, fdel = None,dec=None)

    >>> 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

    >>> c1.getSize()

    18

    >>> del c1.x

    >>> c1.size

    Traceback (most recent call last):

      File "<pyshell#81>", line 1, in <module>

        c1.size

    AttributeError: 'C' object has no attribute 'size'

    相关文章

      网友评论

          本文标题:类的继承笔记

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