虽然我们可以自由地给一个实例绑定各种属性,但是,现实世界中,一种类型的实例应该拥有相同名字的属性。例如,Person类应该在创建的时候就拥有 name、gender 和 birth 属性,怎么办?

在定义 Person 类时,可以为Person类添加一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就能在此为每个实例都统一加上以下属性:

class Person(object):
def __init__(self, name, gender, birth):
self.name = name
self.gender = gender
self.birth = birth

__init__() 方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。

相应地,创建实例时,就必须要提供除 self 以外的参数:

xiaoming = Person('Xiao Ming', 'Male', '1991-1-1')
xiaohong = Person('Xiao Hong', 'Female', '1992-2-2')

有了__init__()方法,每个Person实例在创建时,都会有 name、gender 和 birth 这3个属性,并且,被赋予不同的属性值,访问属性使用.操作符:

print xiaoming.name
# 输出 'Xiao Ming'
print xiaohong.birth
# 输出 '1992-2-2'

要特别注意的是,初学者定义__init__()方法常常忘记了 self 参数:

>>> class Person(object):
... def __init__(name, gender, birth):
... pass
...
>>> xiaoming = Person('Xiao Ming', 'Male', '1990-1-1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() takes exactly 3 arguments (4 given)

这会导致创建失败或运行不正常,因为第一个参数name被Python解释器传入了实例的引用,从而导致整个方法的调用参数位置全部没有对上。

示例:

定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。

class Person(object):
def __init__(self,name,gender,birth,**kw):
self.name=name
self.gender=gender
self.birth=birth
self.kw=kw
xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
print xiaoming.name
print xiaoming.kw

结果:

Xiao Ming
{'job': 'Student'}

最新文章

  1. WIN7系统下U盘安装Ubuntu双系统
  2. 解决 MySQL Cluster 通过 某一个MySqld节点新建表时,其他 MySqld节点 看不到表内容的问题
  3. redmine一键安装包下载链接
  4. 基本event封装:阻止冒泡、默认事件等
  5. Windows Phone开发(2):竖立自信,初试锋茫
  6. 最长非降子序列的O(n^2)解法
  7. java中 this 的三种用法
  8. Socket实现断线重连
  9. Poj1258 Agri-Net (最小生成树 Prim算法 模板题)
  10. VM下载安装
  11. c/c++本地时间获取
  12. Storm的DRPC
  13. iOS 开发笔记-NSURLConnection的使用
  14. 设置 IntelliJ IDEA 的彩色代码主题
  15. Java线程基础知识(状态、共享与协作)
  16. 静态编译opencv3.4.0
  17. 设计神器 - 摹客设计系统上线了 | 晒出你的设计规范,赢iPad Pro!
  18. P3592 [POI2015]MYJ
  19. Python+Selenium UI自动化测试环境搭建及使用
  20. ROS + Caffe 机器人操作系统框架和深度学习框架笔记 (機器人控制與人工智能)

热门文章

  1. 【转】 在Eclipse中使用JUnit4进行单元测试(中级篇)
  2. 寒城攻略:Listo 教你用Swift 语言编写 IOS 平台流媒体播放器
  3. ASP.NET管道技术
  4. linux系统启动过程具体解释-开机加电后发生了什么 --linux内核剖析(零)
  5. centos7 笔记本盒盖不睡眠
  6. hdu 4421(枚举+2-sat)
  7. day9笔记--文件操作
  8. AdnroidUtils-常用工具类(showDiaLog/HTTP)
  9. 七个迹象说明你可能受到APT 攻击
  10. php通过post将表单数据保存到数据库实例