刚学 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, 调用内建函数 help() 时可以看到这些注释信息,这是 python 的标准
log = {'0':'log0'}
def __init__(self):
pass
def fun(self):
pass
python 类的定义语法如上,简单吧.但是 Python 类有区别 C++ 等语言特殊的地方,这里我们主要来谈谈这些特殊的地方
在类定义的紧接下一行的三引号中的注释是类的 doc, 调用内建函数 help() 时可以看到这些注释信息,这是 python 的标准注释方法
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/ 欢迎拍砖吐槽哈....