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生成pdf文件的方法
Aug 04 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 Python
python线程池threadpool实现篇
Apr 27 Python
python验证码识别教程之利用滴水算法分割图片
Jun 05 Python
详解Python的三种可变参数
May 08 Python
python图像处理模块Pillow的学习详解
Oct 09 Python
python用类实现文章敏感词的过滤方法示例
Oct 27 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
用python解压分析jar包实例
Jan 16 Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 Python
Jupyter notebook 启动闪退问题的解决
Apr 13 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
2010/08/01 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
2019/04/10 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
Javascript - HTML的request类
2007/01/09 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
jQuery类选择器用法实例
2014/12/23 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
js滑动提示效果代码分享
2016/03/10 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
vue+element-ui动态生成多级表头的方法
2018/08/28 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
js实现3D旋转相册
2020/08/02 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
EM算法的python实现的方法步骤
2018/01/02 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
django Admin文档生成器使用详解
2019/07/22 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
详解Python多线程下的list
2020/07/03 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
用CSS3的box-reflect设置文字倒影效果的方法讲解
2016/03/07 HTML / CSS
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
股东合作协议书
2014/09/12 职场文书
党的群众路线教育实践活动专题组织生活会发言材料
2014/10/17 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
2019年干货:自我鉴定
2019/03/25 职场文书
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP