谈谈 Python 类

刚学 Python 不久,写下自己的认识,当做学习笔记吧,有什么不对的地方欢迎拍砖…

类定义

class clsA(object):
    '''this is doc'''
    version = 0.1刚学 Python 不久,写下自己的认识,当做学习笔记吧,有什么不对的地方欢迎拍砖...

类定义

class clsA(object):
    '''this is doc'''
    version = 0.1
    log = {'0':'log0'}

    def __init__(self):
        pass
    def fun(self):
        pass

python 类的定义语法如上,简单吧.但是 Python 类有区别 C++ 等语言特殊的地方,这里我们主要来谈谈这些特殊的地方

doc 注释

在类定义的紧接下一行的三引号中的注释是类的 doc, 调用内建函数 help() 时可以看到这些注释信息,这是 python 的标准
log = {‘0’:’log0’}

    def __init__(self):
        pass
    def fun(self):
        pass

python 类的定义语法如上,简单吧.但是 Python 类有区别 C++ 等语言特殊的地方,这里我们主要来谈谈这些特殊的地方

doc 注释

在类定义的紧接下一行的三引号中的注释是类的 doc, 调用内建函数 help() 时可以看到这些注释信息,这是 python 的标准注释方法

__init__(self)方法

int(self) 方法不是构造函数,他只是类实例化后 第一个 自动执行 ,的方法,这个方法也可带上参数来完成必要的出事化

类属性和实例属性

python 类中定义的属性是类的属性

version = 0.1
log = {'0':'log0'}

这两个属性就是类属性,就像是 C++ 中的静态成员变量.

>>>clsA.version
0.1
>>>clsA.version = 0.2
>>>clsA.version
0.2

那么怎么定义实例属性呢? python 的属性可以是动态的,对没错是动态的,对与玩 C++ 的我看到这点我快惊呆了,还可以这么玩…

>>>ia = clsA()
>>>ia.version
0.2
>>>clsA.version = 0.3
>>>ia.version
0.3 # 注意这里值变了
>>>ia.version = 0.4
>>>clsA.version 
0.3 # 注意这里还是 0.3
>>>ia.version
0.4

认真分析这段代码,当实例化实例 ia 时,ia 的 version 属性就是类的属性,所以更改了类的属性值后, 实例 ia 的值也跟这改变了
当对实例 ia 赋值后,实例 ia 也有了 version 属性,此同名属性会隐藏掉类的 version 属性,这里其实有两个 version 属性,所以当改变类 clsA.version 的值后 ia.version 没有改变.

>>>del ia.version
>>>ia.version
0.3

删除实例属性后,实例有将使用类的属性.
接下来我们在看一个可变类型的属性,其实是一样的,但是要注意理解可变类型的特性

>>>ib = clsA()
>>>ib.log
{'0':'log0'}
>>>ib.log['1':'log1']     # 并没有创建实例属性,只是引用了类属性
>>>ib.log
{'0':'log0', '1':'log1' }
>>>clsA.log
{'0':'log0', '1':'log1' } # 所以类属性被修改
>>>
>>>ib.log = {}            # 这样就创建了实例属性,类属性被隐蔽了
>>>ib.log
{}
>>>clsA.log
{'0':'log0', '1':'log1' } 

关键的地方我都注释了,天才的你肯定可以看懂,我就不多啰嗦了^_^…

类的方法

类的方法必须是在实例中调用,用 python 术语是叫 绑定,

>>>clsA.fun()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method fun() must be called with clsA instance as first argument (got nothing instead)
>>> 
>>>ia.fun()
>>>

直接调用抛出异常,实例化后调用就正常了,那么有没有静态方法呢,有的

静态方法和类方法

class TestStaticMethod(object):            
    @staticmethod
    def foo():
        print 'calling static method foo()'

class TestClassMethod(object):
    @classmethod
    def foo(cls):    # 传入类
        print 'calling static method foo()'

>>>tsm = TestStaticMethod()
>>>tsm.foo()
'calling static method foo()'
>>>TestStaticMethod.foo()
'calling static method foo()'
>>>
>>>tcm = TestClassMethod()
>>>tcm.foo()
'calling static method foo()'
>>>TestClassMethod.foo()
'calling static method foo()'

这里使了函数修饰,不懂什么是函数修饰打童鞋可以去搜搜 python 函数修饰.
ps: 这个特性也是个很有意思打特性,以前哇只热衷与 C/C++, 没想到这些动态语言这么有意思,哈哈,学海无涯啊…有种闹东大开打感觉…
好啦,就总结这些,当笔记,例外打个广告: 我在边学 python 的时候边用 Django 搭建啦一个个人主页 http://aquariushome.duapp.com/ 欢迎拍砖吐槽哈….

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值