Python中的类学习笔记


Posted in Python onSeptember 23, 2014

Python使用中面向对象的语言,支持继承、多态;

定义一个Person类:

>>> class Person:

... def sayHello(self):

... print('hello')

...

>>> Person.sayHello(None)

hello

>>> Person().sayHello()

hello
 
可以修改Person的类方法
>>> def hack_sayHello(obj):

... print('...hello')

...

>>>

>>> Person.sayHello = hack_sayHello

>>> Person.sayHello(None)

...hello

>>> Person().sayHello()

...hello

  

>>> sayHello = Person().sayHello

>>> sayHello()

...hello

Person().sayHello也是一个函数,可以赋值给变量,并可以直接调用;
  

>>> Person.sayHello is Person().sayHello

False

>>> Person.sayHello == Person().sayHello

False
 
Person.sayHello与Person().sayhello并不是同一个对象,直觉上,Person().sayHello关联(绑定)了一个Person实例,而Person.sayHello是一个类方法;
 
self参数事实上正是方法和函数的区别:方法将它们的第一个参数绑定到所属的实例上,因此这个参数可以不必提供;
  

>>> class Person:

... name = 'unkown'

... def sayHello(self):

... print('i\'m ' + name)

...

>>>

>>> Person.sayHello(None)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "<stdin>", line 4, in sayHello

NameError: name 'name' is not defined

>>> p = Person()

>>> p.name = 'wyj'

>>> p.sayHello()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "<stdin>", line 4, in sayHello

NameError: name 'name' is not defined
 
可见,Python在解析变量时,默认从local scope/global scope中查找;
  

>>> class Person:

... name = 'unkown'

... def sayHello(self):

... print('i\'m ' + self.name)

...

>>>

>>> Person.sayHello(None)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "<stdin>", line 4, in sayHello

AttributeError: 'NoneType' object has no attribute 'name'

>>> p = Person()

>>> p.name = 'wyj'

>>> p.sayHello()

i'm wyj
 
访问成员都要通过self,假如以包含name属性的对象调用Person.sayHello(obj),是否可以呢?
>>> class Cat:

... name = 'huanhuan'

...

>>> Person.sayHello(Cat())

i'm huanhuan
 
可以,Python并不限制必须用相同类的实例对象作为参数调用类方法(貌似Python的类机制类似Javascript);

访问控制

Python并不直接支持私有方访问,而是要靠程序员自己把握。
 
不过,可以在属性名称前加上双下划线而给其私有访问能力(对外不可见);

>>> class Person:

... def __private_method(self):

... print('private')

... def test(self):

... self.__private_method()

...

>>> Person().test()

private

>>> Person().__private_method()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AttributeError: 'Person' object has no attribute '__private_method'
 
实际上,以上下划线打头的方法都有一个_ClassName__methodName的方法
>>> Person._Person__private_method

<function Person.__private_method at 0x7fed431a2d90>
 
调用
>>> Person._Person__private_method(None)

private

总之,Python并不能阻止从类外进行方法调用;
 
类属性以及对象属性

首先,可以为类添加属性,新对象将得到属性的一份拷贝

>>> Person.age = 3

>>> Person().age

3

>>> Person.age = 4

>>> Person().age

4

>>> p = Person()

>>> Person.age = 31

>>> p.age

31

对类属性的修改,反映到了先前生成的对象的属性上,这说明类属性和对象的属性共享一个值;

>>> p.age = 34

>>> p.age

34

>>> Person.age

31

>>> Person.age = 99

>>> p.age

34

而一旦对对象的属性的修改,对象属性就拥有了自己的值,并不会反映到类属性上,而对类属性的修改,也不再反映到该对象的属性上;

这种行为与Javascript类似

Python中的类学习笔记

Python 相关文章推荐
Python数组条件过滤filter函数使用示例
Jul 22 Python
决策树的python实现方法
Nov 18 Python
Python 详解基本语法_函数_返回值
Jan 22 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 Python
浅析Python3爬虫登录模拟
Feb 07 Python
Python3 max()函数基础用法
Feb 19 Python
python队列Queue的详解
May 10 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
python获取Linux发行版名称
Aug 30 Python
Python decorator拦截器代码实例解析
Apr 04 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
Nov 30 Python
Python函数嵌套实例
Sep 23 #Python
Python中的自定义函数学习笔记
Sep 23 #Python
Python中的exec、eval使用实例
Sep 23 #Python
Python的高级Git库 Gittle
Sep 22 #Python
Python实现抓取网页并且解析的实例
Sep 20 #Python
跟老齐学Python之字典,你还记得吗?
Sep 20 #Python
跟老齐学Python之再深点,更懂list
Sep 20 #Python
You might like
用PHP编写PDF文档生成器
2006/10/09 PHP
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
2014/06/01 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
json的使用小结
2016/06/08 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
JavaScript基本类型值-Undefined、Null、Boolean
2017/02/23 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
python实现人民币大写转换
2018/06/20 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
自荐信怎么写好
2013/11/11 职场文书
公司前台辞职报告
2014/01/19 职场文书
元旦促销方案
2014/03/15 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
工程承诺书怎么写
2014/05/24 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
党员承诺书范文2015
2015/04/27 职场文书
党风廉政教育心得体会2016
2016/01/22 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python