Python进阶之面向对象编程(二)
Python面向对象编程(二)
.note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB","STHeiti","Microsoft YaHei","WenQuanYi Micro Hei",SimSun,Song,sans-serif;}
.note-content h2 {line-height: 1.6; color: #0AA89E;}
.note-content {background: #FFFFFF;}
.note-content h1 {color: #7AB3A7;}
.note-content h3 {color: #147A67;}
Python面向对象编程(二)
1. 创建实例属性
虽然可以通过Person类创建出xiaoming、xiaohong等实例,但是这些实例看上除了地址不同外,没有什么其他不同。在现实世界中,区分xiaoming、xiaohong要依靠他们各自的名字、性别、生日等属性。
如何让每个实例拥有各自不同的属性
?由于Python是动态语言,对每一个实例,都可以直接给他们的属性赋值,例如,给xiaoming这个实例加上name、gender和birth属性:
1.xiaoming=Person()
2.xiaoming.name='Xiao Ming'
3.xiaoming.gender='Male'
4.xiaoming.birth='1990-1-1'
给xiaohong加上的属性不一定要和xiaoming相同:
1.xiaohong=Person()
2.xiaohong.name='Xiao Hong'
3.xiaohong.school='No. 1 High School'
4.xiaohong.grade=2
实例的属性可以像普通变量一样进行操作:
1.xiaohong.grade=xiaohong.grade + 1
2. 初始化实例属性
虽然我们可以自由地给一个实例绑定各种属性,但是,现实世界中,一种类型的实例应该拥有相同名字的属性。例如,Person类应该在创建的时候就拥有 name、gender 和 birth 属性,怎么办?
在定义 Person 类时,可以为Person类添加一个特殊的__init__()
方法,当创建实例时,__init__()
方法被自动调用,我们就能在此为每个实例都统一加上以下属性:
1.class Person(object):
2. def __init__(self, name, gender, birth):
3. self.name = name
4. self.gender = gender
5. self.birth = birth
__init__()
方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。
相应地,创建实例时,就必须要提供除 self 以外的参数:
1.xiaoming = Person('Xiao Ming', 'Male', '1991-1-1')
2.xiaohong = Person('Xiao Hong', 'Female', '1992-2-2')
有了__init__()
方法,每个Person实例在创建时,都会有 name、gender 和 birth 这3个属性,并且,被赋予不同的属性值,访问属性使用.操作符:
1.print xiaoming.name
2.# 输出 'Xiao Ming'
3.print xiaohong.birth
4.# 输出 '1992-2-2'
要特别注意的是
,初学者定义__init__()
方法常常忘记了 self 参数:
1.>>> class Person(object):
2.... def __init__(name, gender, birth):
3.... pass
4....
5.>>> xiaoming = Person('Xiao Ming', 'Male', '1990-1-1')
6.Traceback (most recent call last):
7. File "<stdin>", line 1, in <module>
8.TypeError: __init__() takes exactly 3 arguments (4 given)
这会导致创建失败或运行不正常,因为第一个参数name被Python解释器传入了实例的引用,从而导致整个方法的调用参数位置全部没有对上。
举个例子,Person类的init方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例:
1.class Person(object):
2. def __init__(self, name, gender, birth, **kw):
3. self.name = name
4. self.gender = gender
5. self.birth = birth
6. for k, v in kw.iteritems():
7. setattr(self, k, v)
8.xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
9.print xiaoming.name
10.print xiaoming.job
11.#输出
12.#Xiao Ming
13.#Student
注意:
要定义关键字参数,使用 **kw
;
除了可以直接使用self.name = 'xxx'
设置一个属性外,还可以通过 setattr(self, 'name', 'xxx')
设置属性。
3. 访问限制
我们可以给一个实例绑定很多属性,如果有些属性不希望被外部访问到怎么办?
Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。看例子:
1.class Person(object):
2. def __init__(self, name):
3. self.name = name
4. self._title = 'Mr'
5. self.__job = 'Student'
6.p = Person('Bob')
7.print p.name
8.# => Bob
9.print p._title
10.# => Mr
11.print p.__job
12.# => Error
13.Traceback (most recent call last):
14. File "<stdin>", line 1, in <module>
15.AttributeError: 'Person' object has no attribute '__job'
可见,只有以双下划线开头
的”__job“不能直接被外部访问。
但是,如果一个属性以”__xxx__
“的形式定义,那它又可以被外部访问了,以”__xxx__
“定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用”_xxx_“定义。
以单下划线开头
的属性”_xxx
“虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。
举个栗子:
1.>>> class Person(object):
2.... def __init__(self, name, score):
3.... self.name=name
4.... self.__score=score
5....
6.>>> p = Person('Bob', 59)
7.>>>
8.>>> print p.name
9.Bob
10.>>> print p.__score
11.Traceback (most recent call last):
12. File "<stdin>", line 1, in <module>
13.AttributeError: 'Person' object has no attribute '__score'
Python进阶之面向对象编程(二)的更多相关文章
- Python进阶之面向对象编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...
- Python进阶之面向对象编程概述
Python面向对象编程(一) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...
- Python 进阶_OOP 面向对象编程_组合与继承
#目录 前言 组合 派生 通过继承来覆盖重载方法 最常用的重载场景实例方法的重载 从标准类中派生类方法的重载 前言 我们定义一个类是希望能够把类当成模块来使用,并把类嵌入到我们的应用代码中,与其他的数 ...
- python之路---面向对象编程(二)
类的继承 1.在python3中,只有新式类,新式类的继承方式为:广度优先.而python2中,经典类的继承方式为:深度优先.那么我们来看看深度优先和广度优先的区别吧 如下图,为类之间的继承关系.B, ...
- Python入门之面向对象编程(二)python类的详解
本文通过创建几个类来覆盖python中类的基础知识,主要有如下几个类 Animal :各种属性.方法以及属性的修改 Dog :将方法转化为属性并操作的方法 Cat :私人属性讲解,方法的继承与覆盖 T ...
- Python 进阶_OOP 面向对象编程_self 的实例绑定
目录 目录 self 和绑定 调用非绑定的方法 self 和绑定 在 Python 中 self 变量是特殊的, 其用于在实例方法中引用该方法所绑定的实例, 换句话说就是 Python 在实例化对象时 ...
- Python 进阶_OOP 面向对象编程_实例属性和方法
目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...
- Python 进阶_OOP 面向对象编程_类属性和方法
目录 目录 类属性 调用类属性 查看类属性 特殊的类属性 类方法 真构造器 __new__ 类属性 在理解类属性之前要先搞清楚 实例属性 和 函数属性 之间的区别: 1. 实例属性:指的是实例化类对象 ...
- Python 进阶_OOP 面向对象编程_类和继承
目录 目录 类 最简单的类 类方法 构造器 __init__ 创建一个类 实例化一个对象 调用实例的方法和属性 创建子类 使用 super 来调用父类的构造器 实例化子类对象 调用子类的属性和方法 类 ...
随机推荐
- 整理HTML的一些基础
HTML,超文本标记语言(HyperText Markup Language) 超文本:指页面内可以包含图片.链接.音乐.程序等非文字元素 标记:页面的由各种标签(标记)组成,文本有隐藏的文本标签 H ...
- 异步消息处理机制——Handler用法
Handler 1. Message Messsge是线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据,Message的what字段,除此之外还可以使用arg1和arg2字段 ...
- WPF基础
1.Sender 指的是被点击的控件.默认为object类. private void btnc1_Click(object sender, RoutedEventArgs e) { Button b ...
- mysql 重启
/etc/init.d/mysql restart /etc/init.d/mysql stop /etc/init.d/mysql start
- 实现Jquery触发一事件后,停留5秒,再接着触发下面的事件
这里是一个广告位的Jquery的代码,有两个不同的广告位,一个是中间浮动显示的,显示5秒后自动消失,并限定每天仅出现一次(Cookie实现): //=====================广告位的j ...
- synchronized 关键字
synchronized 多用于并发不高并且需要单线程运行的地方.比如你有一个A方法,你在方法上加了synchronized修饰.那么两个人同时去调用这个方法的时候不是并行的,是抢占的,谁先抢到资源谁 ...
- eclipse 使用maven 创建web3.1项目
最近刚刚开始学java, 在框架搭建的过程中, 遭遇了诸多的坑, 和各种各样的不解与困惑, 由于没有什么java的相关基础, 看到各种xml的配置文件, 当真是一个头两个大. 并且并不知道那个配置到底 ...
- grep 和 perl多个条件匹配
grep和perl多个条件匹配使用‘|’作为分割符号 grep -E 'abc|def' perl if(/abc|def/)
- javascript中的with
with语句主要用来对一个对象操作多个属性,使代码简洁易读. 语法: with(object) statements object是新的默认对象,statements是一个或多个语句 例如: var ...
- poj中一些对我来说不错的东西(每天不同的加入,要保持)
1.关于深度搜索与暴力结合的棋盘翻转问题 poj1753::2965:: 2.贪心算法:2109,2586: 3.韩信点兵问题:poj1006