《Python面向对象编程指南》——1.2 基类中的__init__()方法
本节书摘来自异步社区《Python面向对象编程指南》一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.2 基类中的__init__()方法对象的生命周期主要包括了创建、初始化和销毁。后面章节会详细讨论对象的创建和销毁,本章专注于对象的初始化。
object作为所有类的基类,已经为__init__()方法提供了默认实现,一般情况下不需要重写这个函数。如果没有对它进行重写,那么在创建对象时将不会产生其他变量的实例。在某些情况下,这种默认行为是可以接受的。
对于继承自object的子类,总可以对它的属性进行扩展。例如,对于下面这个类,实例化就不对函数(area)所需要的变量(width和length)进行初始化。
class Rectangle: def area( self ): return self.length * self.width
Rectangle类的area函数在返回值时使用了两个属性,可并没有在任何地方对其赋值。在Python中,这种看似奇怪的调用尚未赋值属性的操作却是合法的。
下面这段代码演示如何使用刚定义的Rectangle类。
r= Rectangle() r.length, r.width = 13, 8 r.area() 104
虽然这种延迟赋值的实现方式在Python中是合法的,但是却给调用者带来了潜在的困惑,因此要尽量避免这样的用法。
然而,这样的设计看似又提供了灵活性,意味着在__init__()方法被调用时不必为所有的属性赋值。这看似是不错的选择,一个可选属性即可以看作是某子类中的成员,且无须对这个子类进行显式地定义就可以完成对原生机制的扩展。然而这种多态机制不但给程序带来了隐藏的不确定性,也会相应产生很多令人费解的if语句。
因此,延迟初始化属性的设计在某种情形下可能会有用,可是这样也可能会导致非常糟糕的设计。
在Zen of python poem一书中曾提出过这样的建议:
“显式而非隐式”。
对于每个__init__()方法,都应当显式地指定要初始化的变量。
![6739d8df10f9580fb83d04e43194596ca44c5d0c](https://yqfile.alicdn.com/6739d8df10f9580fb83d04e43194596ca44c5d0c.png)
说说Python中的__new__和__init__的区别?(下) 公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助!
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- Python中threading.local方法
- 【Python五篇慢慢弹】数据结构看python
- Python深入学习之特殊方法与多范式
- 使用python操作ansible:实现对playbook的管理
- Python语言学习:Python语言学习之正则表达式常用函数之re.search方法【输出仅一个匹配结果(内容+位置)】、re.findall方法【输出所有匹配结果(内容)】案例集合之详细攻略
- Python编程语言学习:基于python各种库(matplotlib、Image)利用多种方法展示图片或进行图片可视化之详细攻略
- Python编程语言学习:包导入和模块搜索路径(包路径)简介、使用方法(python系统环境路径的查询与添加)之详细攻略
- Python之matplotlib:基于matplotlib库利用python语言实现一张画布显示多张图的多种方法
- Python:pmml格式文件的简介、安装、使用方法(利用python将机器学习模型转为Java常用的pmml格式文件)之详细攻略
- Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能
- Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法
- Py之chatterbot:python包之Chatterbot包/wxpy包简介、安装、使用方法之详细攻略
- Py之PIL:Python的PIL库的简介、安装、使用方法详细攻略
- 已解决2.Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and wi
- Python Flask框架学习16:Flask 消息闪现
- python读取 pcd 数据 三种方法
- 写网络爬虫天然就是择Python而用 python 网络爬虫3
- Python 的字符运算符 r 和 u (2020-04-08)[32.51%]
- 【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
- python 忽略警告(warning)的几种方法
- python工具方法 31 通过导入自定义dll实现显存释放
- python工具方法 16 保存模型分类后的数据及分类错误的数据
- python 无重复字符的最长子串