Skip to content

Latest commit

 

History

History
158 lines (123 loc) · 4.4 KB

19.md

File metadata and controls

158 lines (123 loc) · 4.4 KB

谈谈 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, 调用内建函数 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/ 欢迎拍砖吐槽哈....