下面我根据 MARK Lutz 的《Learning Python》中的 "大师眼中的 OOP", 列一些使用 OOP 的常见原因.
代码重用. 这是很简单 (并且是使用 OOP 的最主要原因). 通过支持继承, 类允许通过定制来编程, 而不是每次都从头开始一个项目.
封装. 在对象接口后包装其实现的细节, 从而隔离了代码的修改对用户产生的影响.
结构. 类提供了一个新的本地作用域, 最小化了变量名冲突. 他们还提供了一种编写和查找实现代码, 以及去管理对象状态的自然场所.
维护性. 类自然而然地促进了代码的分解, 这让我们减少了冗余. 对亏支持类的结构以及代码重用, 这样每次只需要修改代码中一个拷贝就可以了.
一致性. 类和继承可以实现通用的接口. 这样代码不仅有了统一的外表和观感, 还简化了代码的调试, 理解以及维护.
多态. 多态让代码更灵活和有了广泛的适用性.(这似乎是 OOP 的属性, 不是使用它的理由)
此外, 对于 python2 来说, 还有一个叫做 "新式类"(new-style) 的东西, 这个对应于前面讲过的类, 那么前面讲过的类就称为 "经典"(classic) 类. 但是, 对于 Python3 来讲, 没有这种区别, 二者融合. 只是在 Python2 中, 两个是有区别的. 在基础部分, 依然不讲授新式类的问题, 如果有兴趣, 可以自己在 GOOGLE 中查找有关资料, 也可以随着我博客的深入, 到下一个阶段来学习.
绑定和无绑定方法
类的方法就是函数, 只不过这个函数的表现有点跟前面学过的函数不一样, 比如有个 self. 当然, 也不是必须要有的, 下面就会看到没有 self 的. 既然方法和函数一样, 本质上都是函数, 那么, 函数那部分学习的时候已经明确了: 函数是对象, 所以, 类方法也是对象. 正如刚才说的, 类的方法中, 有的可以有 self, 有的可以没有. 为了进行区别, 进一步做了这样的定义:
无绑定类方法对象: 无 self
绑定实例方法对象: 有 self
调用绑定实例方法对象
- >>> class MyClass:
- ... def foo(self,text):
- ... print text
- ...
可以用下面的方式调用实例方法
- >>> a = MyClass() #创建类实例
- >>> a.foo('hiekay.github.io') #调用实例方法
- hiekay.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("hiekay.github.io")
- hiekay.GitHub.io
在上面的调用中, 其实相当于前面的调用过程的分解动作. 即先将实例 a 和方法函数 foo 绑定在一起, 然后赋值给 x, 这时候 x 就相当于一个简单函数一样, 可以通过上述方式传入参数. 这里将实例和方法函数绑定的方式就是运用点号运算 (object.method_function)
调用无绑定类方法对象
所谓类方法对象, 就是不通过实例, 而是用类进行点号运算来获得方法函数 (ClassName.method_function)
- >>> a = MyClass()
- >>> y = MyClass.foo #这里没有用类调用
- >>> y
- <unbound method MyClass.foo>
这样的调用, 就得到了无绑定方法对象, 但是, 调用的时候必须传入实例做为第一参数, 如下
- >>> y(a,"hiekay.github.io")
- hiekay.GitHub.io
否则, 就报错. 请看官特别注意报错信息
- >>> y("hiekay.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)
- >>>
在编程实践中, 似乎用实例方法调用更多一下.
文档字符串
在写程序的时候, 必须要写必要的文字说明, 没别的原因, 除非你的代码写的非常容易理解, 特别是各种变量, 函数和类等的命名任何人都能够很容易理解, 否则, 文字说明是不可缺少的.
在函数, 类或者文件开头的部分写文档字符串说明, 一般采用三重引号. 这样写的最大好处是能够用 help() 函数看.
- """This is python lesson"""
- def start_func(arg):
- """This is a function."""
- pass
- class MyClass:
- """Thi is my class."""
- def my_method(self,arg):
- """This is my method."""
- pass
这样的文档是必须的.
当然, 在编程中, 有不少地方要用 "#" 符号来做注释. 一般用这个来注释局部.
来源: https://yq.aliyun.com/articles/683410