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入门篇之对象类型
Oct 17 Python
Python函数式编程指南(二):从函数开始
Jun 24 Python
浅谈Python 集合(set)类型的操作——并交差
Jun 30 Python
Python实现网站注册验证码生成类
Jun 08 Python
用python实现百度翻译的示例代码
Mar 09 Python
Python多线程原理与用法实例剖析
Jan 22 Python
python 自动轨迹绘制的实例代码
Jul 05 Python
python实现微信自动回复机器人功能
Jul 11 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
Aug 23 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
Python直接赋值及深浅拷贝原理详解
Sep 05 Python
如何解决python多种版本冲突问题
Oct 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
关于mysql 字段的那个点为是定界符
2007/01/15 PHP
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
PHP中实现Bloom Filter算法
2015/03/30 PHP
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
extjs 为某个事件设置拦截器
2010/01/15 Javascript
javascript函数中的arguments参数
2010/08/01 Javascript
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
jQuery实现固定在网页顶部的菜单效果代码
2015/09/02 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
python创建列表并给列表赋初始值的方法
2015/07/28 Python
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
客户代表实习人员自我鉴定
2013/09/27 职场文书
捐款倡议书范文
2014/02/02 职场文书
入党积极分子评语
2014/05/04 职场文书
2015年教研工作总结
2015/05/23 职场文书
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js