• Python学习笔记008_类_对象_继承_组合_类相关的BIF


    # 对象 = 属性 + 方法
    >>> # Python中的类名约定以大写字母开始
    >>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它是不需要的
    >>>
    >>> # Python中的self就相当于Java中的this


    >>> # self ,一般都放在方法的第一个参数中这是默认的要求

    class Ball:
        def setName(self,name):
            self.name=name
        def kick(self):
            print("我叫%s,谁踢我,找死啊..." %self.name)
    
    
    a = Ball() # 不需要用new关键字,注意和其它语言的区别
    a.setName("阿黄")
    b = Ball()
    b.setName("黄红义")
     
    a.kick()
    我叫阿黄,谁踢我,找死啊...
    b.kick()
    我叫黄红义,谁踢我,找死啊...
       


    >>>
    >>> # Python的魔法方法,它是被Python在特殊的时候自动调用的
    >>> # 这些魔法方法有一个特点,就是被双下划线包围
    >>> # 比如 __init__(self)
    >>> # __init__(self,param1,param2,...) ,是构造方法,实例化对象时自动被调用
    >>>

    class Ball:
        def __init__(self,name):
            self.name = name
        def kick(self):
            print("我叫%s,谁踢我,找死啊..." %self.name)
    
            
    b = Ball('土豆')
    b.kick()
    我叫土豆,谁踢我,找死啊...

    >>>

    >>># 在Python中定义私有变量或者函数,只需要在名字前加两个下划线"__"

    >>> class Person:
        __name = '猪八戒'
    
        
    >>> p = Person()
    >>> p.__name
    Traceback (most recent call last):
      File "<pyshell#45>", line 1, in <module>
        p.__name
    AttributeError: 'Person' object has no attribute '__name'

    >>>

    >>># 实际上,Python是将 __开头的私有属性和方法的名称改编成了 _类名__变量名
    >>> # 从这一点可以看出,Python的私有化是伪私有

    >>> class Person:
        __name = '猪八戒'
        def getName(self):
            return self.__name
    
        
    >>> p = Person()
    >>> p.getName()
    '猪八戒'
    >>> 
    >>> p._Person__name
    '猪八戒'

    >>> # 继承语法 class DerivedClassName(BaseClassName):
    >>> # ......
    >>> # 子类可以继承父类的所有方法和属性
    >>> # 如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性
    >>>
    >>>

    >>> import random as r
    >>> 
    >>> class Fish:
        def __init__(self):
            self.x = r.randint(0,10)
            self.y = r.randint(0,10)
        def move(self):
            self.x -= 1
            print("我的位置:",self.x,self.y)
    
    >>> 
    >>> class Shark(Fish):
        def __init__(self):
            self.hungry = True
        def eat(self):
            if self.hungry:
                print('吃货的日子就是这个样子^_^')
                            self.hungry = False
            else :
                print('吃撑了')         
    
           

    >>> fish = Fish()
    >>> fish.move()
    我的位置: 6 3

    >>> shark = Shark()
    >>> shark.move()
    Traceback (most recent call last):
    File "<pyshell#60>", line 1, in <module>
    shark.move()
    File "<pyshell#52>", line 6, in move
    self.x -= 1
    AttributeError: 'Shark' object has no attribute 'x'

    # 因为__init__方法被重写,所以没有了 x属性

     # 解决上面的方式有两种方式
    >>> # 1, 调用未绑定的父类方法
    >>> # 2, 使用super函数 (推荐使用)
    
    class Shark(Fish):
        def __init__(self):
            Fish.__init__(self)  # 调用未绑定的父类方法
            self.hungry = True
        def eat(self):
            if self.hungry:
                print('吃货的日子就是这个样子^_^')
    
                
    >>> shark = Shark()
    >>> shark.move()
    我的位置: 3 2
     
    >>> class Shark(Fish):
        def __init__(self):
            super.__init__()  # super(),它不用传递self参数
            self.hungry = True
        def eat(self):
            if self.hungry:
                print('吃货的日子就是这个样子^_^')
    

    >>> # 支持多继承
    >>> class class DerivedClassName(base1,base2,base3...):

    >>>
    >>> # 组合: 就是把类实例化,放到一个新类里面
    >>>
    >>> # 举例子说明:现在要定义一个类,叫水池,水池里面要有乌龟和鱼
    >>>

    >>> 
    >>> 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(2,3)
    >>> pool.print_num()
    水池中有2只乌龟,3条鱼
    >>> 

    >>>
    >>> # 类中定义的属性都是静态属性
    >>> # 类属性和类对象是相互绑定的,并不依赖于实例对象
    >>>
    >>> # 如果属性名和方法名相同,属性会覆盖方法
    >>>
    >>> #绑定? Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念
    >>>
    >>> # 大多时候我们使用的都是实例属性,只有在跟踪类的某些状态时候才使用类属性
    >>>
    >>>

    >>> # 类相关的一些BIF函数
    >>> #issubclass(Class,classinfo), 如果Class是classinfo的子类,返回True,否则返回False
    >>> # 一个类被认为是其自身的子类
    >>> # classinfo可以是类对象组成的元祖,只要class是其中任何一个候选类的子类,返回True
    >>>
    >>> # object是所有类的基类
    >>>

    >>> class A:
        pass
    
    >>> class B(A):
        pass
    
    >>> issubclass(B,A)
    True
    >>> issubclass(B,B)
    True
    >>> issubclass(B,object)
    True
    >>> 

    # isinstance(object,classinfo) , 实例对象是否属于类的实例对象
    >>>
    >>> # 如果第一个参数不是对象,则永远返回False
    >>> # 如果第二个参数不是类或者由类对象组成的元祖,会抛出一个TypeError异常
    >>>

    >>> b = B()
    >>> isinstance(b,B)
    True
    >>> isinstance(b,A)
    True

    >>> # 几个与属性attr 相关的BIF
    >>>
    >>> # hasattr(object,name) # 对象是否拥有某个属性

    >>> class C:
        def __init__(self,x=0):
            self.x = x
    
            
    >>> c1 = C()
    >>> hasattr(c1,"x")
    True

    >>> # getattr(object,name[,default]) ,获取对象指定的属性值,如果属性不存在,打印default指定的值

    >>> getattr(c1,"y","你访问的属性不存在...")
    '你访问的属性不存在...'
    >>> 

    >>> # setattr(object,name,value), 设置对象的属性值,如果属性不存在,则新建这个属性并且设置为value指定的值

    >>> setattr(c1,'y','yangw')
    >>> getattr(c1,'y',"你访问的属性不存在...")
    'yangw'
    >>> 

    >>>
    >>> # delattr(object,name) ,删除对象的属性,如果属性不存在则抛出异常

    >>> delattr(c1,'y')
    >>> delattr(c1,'y')
    Traceback (most recent call last):
      File "<pyshell#106>", line 1, in <module>
        delattr(c1,'y')
    AttributeError: y
    >>> 

    >>>

    >>> #*********这个属性是很有用的 ********

    >>> property(fget=None,fset=None,fdel=None,doc=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)
    
        
    >>> c = C()
    >>> # 这时我们可以利用x来设置size的值
    >>> c.x=20  # 会调用 setSize方法
    >>> c.getSize()
    20
    >>> c.size   # 会调用 getSize方法
    20
    >>> del c.x #会调用  delSize方法
    
    >>> c.size  # 属性已删除,再执行就会抛出异常
    
    Traceback (most recent call last):
      File "<pyshell#136>", line 1, in <module>
        c.size
    AttributeError: 'C' object has no attribute 'size'
    >>> 
    ----------- 赠人玫瑰,手有余香     如果本文对您有所帮助,动动手指扫一扫哟   么么哒 -----------


    未经作者 https://www.cnblogs.com/xin1006/ 梦相随1006 同意,不得擅自转载本文,否则后果自负
  • 相关阅读:
    Spring Boot 使用Redis
    openTSDB(转)
    httpClient 超时时间设置(转)
    HTTPClient 超时链接设置
    入坑python 自己写的小工具,纪念一下
    Linux下SVN创建新的项目
    java对象数组的概述和使用
    解决fastDFS客户端连接超时问题
    显示目录结构
    centos7开启80和8080端口
  • 原文地址:https://www.cnblogs.com/xin1006/p/4966417.html
Copyright © 2020-2023  润新知