当前位置: 首页 > news >正文

python中初始化实例属性

虽然我们可以自由地给一个实例绑定各种属性,但是,现实世界中,一种类型的实例应该拥有相同名字的属性。例如,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'}

 

转载于:https://www.cnblogs.com/Lambda721/p/6129344.html

相关文章:

  • SpringMVC常用注解的用法
  • ionic ng-repeat 循环传值
  • Windows下xgboot安装
  • CentOS 6.3下nginx、php-fpm、drupal快速部署
  • Android ScrollView截图和图片保存到相册的方式
  • android显示png图片,原来透明的地方都变成黑色的了
  • UINavigation导航控制器的使用
  • C#学习基本概念之Tuple类(元组、重数)
  • LINUX用户、用户组及权限管理
  • js 键盘码对应表
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • MyBatis的关联关系 一对一 一对多 多对多
  • iOS—仿微信单击放大图片
  • 内核优化参数
  • webpack搭建前端一条龙服务
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 77. Combinations
  • css的样式优先级
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JAVA并发编程--1.基础概念
  • Magento 1.x 中文订单打印乱码
  • MySQL数据库运维之数据恢复
  • Phpstorm怎样批量删除空行?
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • spring boot下thymeleaf全局静态变量配置
  • Terraform入门 - 3. 变更基础设施
  • yii2权限控制rbac之rule详细讲解
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 移动端解决方案学习记录
  • 转载:[译] 内容加速黑科技趣谈
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #每日一题合集#牛客JZ23-JZ33
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (c语言)strcpy函数用法
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (第61天)多租户架构(CDB/PDB)
  • (二)Linux——Linux常用指令
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)php新闻发布平台 毕业设计 141646
  • .net core控制台应用程序初识
  • .net framework 4.0中如何 输出 form 的name属性。
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [ACM] hdu 1201 18岁生日
  • [AIGC] 如何建立和优化你的工作流?
  • [AX]AX2012 R2 出差申请和支出报告
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [C/C++]数据结构 循环队列
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [ESP32] 编码旋钮驱动
  • [JS]JavaScript 注释 输入输出语句