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类应该在创建的时候就拥有 namegenderbirth 属性,怎么办?

在定义 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实例在创建时,都会有 namegenderbirth 这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进阶之面向对象编程(二)的更多相关文章

  1. Python进阶之面向对象编程

    面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  2. Python进阶之面向对象编程概述

    Python面向对象编程(一) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

  3. Python 进阶_OOP 面向对象编程_组合与继承

    #目录 前言 组合 派生 通过继承来覆盖重载方法 最常用的重载场景实例方法的重载 从标准类中派生类方法的重载 前言 我们定义一个类是希望能够把类当成模块来使用,并把类嵌入到我们的应用代码中,与其他的数 ...

  4. python之路---面向对象编程(二)

    类的继承 1.在python3中,只有新式类,新式类的继承方式为:广度优先.而python2中,经典类的继承方式为:深度优先.那么我们来看看深度优先和广度优先的区别吧 如下图,为类之间的继承关系.B, ...

  5. Python入门之面向对象编程(二)python类的详解

    本文通过创建几个类来覆盖python中类的基础知识,主要有如下几个类 Animal :各种属性.方法以及属性的修改 Dog :将方法转化为属性并操作的方法 Cat :私人属性讲解,方法的继承与覆盖 T ...

  6. Python 进阶_OOP 面向对象编程_self 的实例绑定

    目录 目录 self 和绑定 调用非绑定的方法 self 和绑定 在 Python 中 self 变量是特殊的, 其用于在实例方法中引用该方法所绑定的实例, 换句话说就是 Python 在实例化对象时 ...

  7. Python 进阶_OOP 面向对象编程_实例属性和方法

    目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...

  8. Python 进阶_OOP 面向对象编程_类属性和方法

    目录 目录 类属性 调用类属性 查看类属性 特殊的类属性 类方法 真构造器 __new__ 类属性 在理解类属性之前要先搞清楚 实例属性 和 函数属性 之间的区别: 1. 实例属性:指的是实例化类对象 ...

  9. Python 进阶_OOP 面向对象编程_类和继承

    目录 目录 类 最简单的类 类方法 构造器 __init__ 创建一个类 实例化一个对象 调用实例的方法和属性 创建子类 使用 super 来调用父类的构造器 实例化子类对象 调用子类的属性和方法 类 ...

随机推荐

  1. 【floyd求最小环】【Vijos 1046】【观光旅游】

    标签:图结构 最短路 题目大意:给你一个无向图,至少经过3个节点的简单回路(不能包括其他环) 一开始的思路:用一个NUM[i][j]表示i到j的最短路经过几个节点,显然解法不太优美,而且还是错的 再想 ...

  2. 用HtmlLink来改变网站的主题

    #region Theme // 注册样式(将主题样式至于通用样式后面) HtmlLink themeCss = new HtmlLink(); themeCss.Href = GetThemeUrl ...

  3. 详解Linq to SQL

    第一部分,什么是Linq to sql Linq to sql(或者叫DLINQ)是LINQ(.NET语言集成查询)的一部分,全称基于关系数据的 .NET 语言集成查询,用于以对象形式管理关系数据,并 ...

  4. SQL Server 已提交读快照 测试

    1. 打开数据库 已提交读快照 选项 2. 数据库 已提交读快照 模式下的测试 a) 测试表 Test b) 开启事务1,更新数据C2 = '200'(未提交) BEGIN TRAN ' WHERE ...

  5. UITabBarItem

    – finishedSelectedImage 返回选中时的图表 – finishedUnselectedImage 返回为选中时的图表 – setFinishedSelectedImage:with ...

  6. HDU 4415 - Assassin’s Creed

    Problem Description Ezio Auditore is a great master as an assassin. Now he has prowled in the enemie ...

  7. [Tree]Binary Tree Preorder Traversal

    Total Accepted: 97599 Total Submissions: 257736 Difficulty: Medium Given a binary tree, return the p ...

  8. log4net自定义扩展及配置说明

    log4net文件保存配置我就不说太多了,网上一大把的,数据库配置其实网上也有,只是我第一次按照网上的配置没有跑通,我就说下数据库配置需要注意的地方吧. 下面是一个log4net的数据库代码配置 pu ...

  9. codevs 1922 骑士共存问题 网络流

    题目链接 给一个n*n的棋盘, 上面有障碍物, 有障碍物的不能放东西.然后往上面放马, 马不能互相攻击, 问最多可以放多少个马. 按x+y的奇偶来划分, 如果两个格子可以互相攻击, 就连一条权值为1的 ...

  10. 一步一步学习SignalR进行实时通信_4_Hub

    原文:一步一步学习SignalR进行实时通信_4_Hub 一步一步学习SignalR进行实时通信\_4_Hub SignalR 一步一步学习SignalR进行实时通信_4_Hub 前言 创建Hub 配 ...