您的位置:首页 > 编程语言 > Python开发

谈谈 Python 类

2015-06-02 22:29 1006 查看
刚学 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/ 欢迎拍砖吐槽哈….
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: