美文网首页
Python中的类

Python中的类

作者: Rokkia | 来源:发表于2016-10-09 15:54 被阅读32次

    作为一个面向对象的语言,类是少不了的。同时连带着的还有继承、多态、封装。
    首先看一下类的定义:

    class newClass(object):
        def __init__(self):
            print 'class init'
    

    class:如同def一样,标记这是一个class
    newClass:类名
    object:这个是你的超类,可能在别的语言里叫父类,object是所有类的超类

    在创建这个类的同时呢,我们还创建了一个方法
    什么是方法呢
    仔细看init这个方法 ,这不就是函数嘛,其实跟函数区别不大,最大的区别就是,方法的第一个参数一定是self,不写会报错的。

    说完创建再来看看使用:

    newC = newClass()
    #打印
    class init
    

    发生了什么,为什么我创建的时候会打印了一句class init,原因在于,当你创建init这个方法的时候,在对象创建时就会自动执行这个方法,于是,打印出来class init这句话。其实在newClass()的括号中是可以传值的,但是由于我们的init方法并没有参数,所以我们就不需要传了。
    需要传值的情况:

    class newClass(object):
        def __init__(self,name):
            self.name = name 
            print self.name
    
    #如果不传入name,会报错提醒你少穿一个参数
    newC = newClass()
    TypeError: __init__() takes exactly 2 arguments (1 given)
    #正确
    newC = newClass('1Ran')
    #打印
    1Ran
    

    你会发现self.name,这个name是什么呢,name其实是类的属性,由于python是动态语言,所以当你有需要添加属性的时候,可以直接使用即可。

    我们可以用dir(newC)来查看newC中有的所有属性,当然你同时会看到init也在里面,毕竟方法也是一种变量嘛。

    说到属性,又需要说说属性的一些特点:

    1.属性

    属性就是最普通的,如

    class newClass(object):
        def __init__(self,name):
            self.name = name 
            print self.name
    #name就是一个属性,你可以在外面访问
    newC = newClass('1Ran')
    1Ran
    
    newC.name
    1Ran
    
    newC.name = 'love 1Ran'
    
    newC.name
    love 1Ran
    #用实例变量是可以修改的
    
    2.私有属性
    #私有属性是以__或_开头的属性
    如:
    class newClass(object):
        def __init__(self,name):
            self.name = name 
            print self.name
        __age = 18
    

    这里的__age就是一个私有属性,怎样验证呢,使用一下就知道了
    使用:

    newC = newClass('1Ran')
    newC.__age 
    #直接报错,说找不到age这个属性
    AttributeError: 'newClass' object has no attribute 'age'
    

    为什么呢,因为被隐藏了。取不到值我们来赋值试一下。

    newC.__age = 20
    

    成功了,什么情况,不是被隐藏了嘛,为什么还能修改成功。因为python是动态语言,在你给newC实例赋值时相当于给这个实例绑定了一个__age变量
    让我们看看下面这种情况

    class newClass(object):
        def __init__(self,name):
            self.name = name 
            print self.name
        __age = 18
        #在方法中返回,虽然__age被隐藏了,但是可以在类内部使用
        def get_age(self): #self不要忘哦
            return self.__age
    
    #使用
    newC = newClass('1Ran')
    1Ran
    newC.get_age()
    #我们可以拿到
    18
    #让我们做一下改变
    newC.__age = 20
    #看似成功了
    newC.get_age()
    #18岁,不是改了20嘛。这里就可以证明了,在使用self.__age 与newC.__age并不是一个
    18
    
    3.类属性

    类属性是什么,就是通过类名来调用的属性...是不是有点无语
    举个例子吧

    class newClass(object):
        def __init__(self,name):
            self.name = name 
            print self.name
        __age = 18
        #这就是类属性哦
        score = 0
    

    你没看错新添加的属性就是类属性,我们可以这样用:

    #查看
    newClass.score
    0
    #设置值
    newClass.score = 20
    #查看
    newClass.score
    20
    

    有什么用呢,比如你在玩一个游戏,游戏一般有自高分喽
    于是我们这样写:

    class newGame(object):
         def __init__(self,name):
             self.name = name
             self.score = 0
         maxScore = 0
         #设置玩家分数
         def set_myScore(self,score):
             self.score = score
         #获取最高分
         def get_maxScore(self):
              #当玩家分数高于最高分时,更新最高分
             if newClass.maxScore < self.score:
                 newClass.maxScore = self.score
             return newClass.maxScore
    
    #我创建了一个角色,起名1Ran
    me = newGame('1Ran')
    #查看一下最高分
    me.get_maxScore()
    0
    #玩过游戏后我得了10分于是我成了最高的  
    me.set_myScore(10)
    me.get_maxScore()
    #没有问题,最高分已经更新为了10分
    10
    #经不住诱惑你也玩这个游戏了
    you = newGame('you')
    #你先查看了一下最高分
    you.get_maxScore()
    10
    #好强的你想要成为第一,于是你玩啊玩,玩到了100分
    you.set_myScore(100)
    #查看一下确实是100分了
    you.get_maxScore()
    100
    #我隔天一查发现分数太高了,于是我放弃了
    me.get_maxScore()
    100
    #但是GM是个心机婊,默默在后天执行了一句
    newGame.maxScore = 1000
    于是。。。
    

    本文只是对自己平时学习的总结,如有不对的地方,还望各位指出,一起交流学习

    相关文章

      网友评论

          本文标题:Python中的类

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