跟老齐学Python之类的细节

2019-10-05 15:50:46丽君

 •无绑定类方法对象:无self
 •绑定实例方法对象:有self
 
调用绑定实例方法对象


>>> class MyClass:
...     def foo(self,text):
...         print text
...

 可以用下面的方式调用实例方法


>>> a = MyClass()       #创建类实例
>>> a.foo('qiwsir.github.io')       #调用实例方法
qiwsir.github.io
>>> a.foo
<bound method MyClass.foo of <__main__.MyClass instance at 0xb74495ac>>

 在这个实例方法调用的时候,其数据传递流程,在《编写类之二方法》中有一张图,图中显示了,上述的调用方法中,其实已经将实例名称a传给了self,这就是调用绑定实例方法对象,有self。

上面的调用过程,还可以这样来实现:


>>> a = MyClass()
>>> x = a.foo       #把实例a和方法函数foo绑定在一起
>>> x
<bound method MyClass.foo of <__main__.MyClass instance at 0xb74495ac>>
>>> x("qiwsir.github.io")
qiwsir.github.io

 在上面的调用中,其实相当于前面的调用过程的分解动作。即先将实例a和方法函数foo绑定在一起,然后赋值给x,这时候x就相当于一个简单函数一样,可以通过上述方式传入参数。这里将实例和方法函数绑定的方式就是运用点号运算(object.method_function)

调用无绑定类方法对象

所谓类方法对象,就是不通过实例,而是用类进行点号运算来获得方法函数(ClassName.method_function)


>>> a = MyClass()
>>> y = MyClass.foo     #这里没有用类调用
>>> y
<unbound method MyClass.foo>

 这样的调用,就得到了无绑定方法对象,但是,调用的时候必须传入实例做为第一参数,如下


>>> y(a,"qiwsir.github.io")
qiwsir.github.io

 否则,就报错。请看官特别注意报错信息


>>> y("qiwsir.github.io")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method foo() must be called with MyClass instance as first argument (got str instance instead)
>>>

 在编程实践中,似乎用实例方法调用更多一下。

文档字符串

在写程序的时候,必须要写必要的文字说明,没别的原因,除非你的代码写的非常容易理解,特别是各种变量、函数和类等的命名任何人都能够很容易理解,否则,文字说明是不可缺少的。