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编写一个国际象棋AI程序
Nov 28 Python
Python浅拷贝与深拷贝用法实例
May 09 Python
Python的randrange()方法使用教程
May 15 Python
python中json格式数据输出的简单实现方法
Oct 31 Python
python分析作业提交情况
Nov 22 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
Python2和3字符编码的区别知识点整理
Aug 08 Python
Python操作SQLite数据库过程解析
Sep 02 Python
浅谈pycharm使用及设置方法
Sep 09 Python
python打印直角三角形与等腰三角形实例代码
Oct 20 Python
python爬虫之遍历单个域名
Nov 20 Python
TensorFLow 不同大小图片的TFrecords存取实例
Jan 20 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 session
2013/10/28 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
php禁止浏览器使用缓存页面的方法
2014/11/07 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
JS是按值传递还是按引用传递
2015/01/30 Javascript
JavaScript 日期时间选择器一些小结
2018/04/02 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
python写xml文件的操作实例
2014/10/05 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
python 用所有标点符号分隔句子的示例
2019/07/15 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
python+opencv实现车道线检测
2021/02/19 Python
使用HTML5在网页中嵌入音频和视频播放的基本方法
2016/02/22 HTML / CSS
舞会礼服和舞会鞋:PromGirl
2019/04/22 全球购物
linux面试相关问题
2012/08/11 面试题
EJB面试题
2015/07/28 面试题
电大物流学生的自我评价
2013/10/25 职场文书
有针对性的求职自荐信
2013/11/14 职场文书
英文自荐信格式
2013/11/28 职场文书
低碳环保演讲稿
2014/08/28 职场文书
教师自我剖析材料
2014/09/29 职场文书
优秀团支部申报材料
2014/12/26 职场文书
秦兵马俑导游词
2015/02/02 职场文书
大学运动会加油稿
2015/07/22 职场文书
详解MySQL集群搭建
2021/05/26 MySQL
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js
Python制作表白爱心合集
2022/01/22 Python
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python