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中的深拷贝和浅拷贝详解
Jun 03 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 Python
python学习必备知识汇总
Sep 08 Python
Python pyinotify日志监控系统处理日志的方法
Mar 08 Python
python3+opencv3识别图片中的物体并截取的方法
Dec 05 Python
Python 日期区间处理 (本周本月上周上月...)
Aug 08 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
May 24 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
Feb 07 Python
python 字典和列表嵌套用法详解
Jun 29 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
PHP 实例化类的一点摘记
2008/03/23 PHP
php设计模式之命令模式使用示例
2014/03/02 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
Javascript 去除数组的重复元素
2010/05/04 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
2017/01/18 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
React Component存在的几种形式详解
2018/11/06 Javascript
webpack4实现不同的导出类型
2019/04/09 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
python生成器generator用法实例分析
2015/06/04 Python
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
python实现手机通讯录搜索功能
2018/02/22 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Python facenet进行人脸识别测试过程解析
2019/08/16 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
CNC数控操作工岗位职责
2013/11/19 职场文书
毕业自荐书
2013/12/09 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
单位政审意见范文
2015/06/04 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
详解Django的MVT设计模式
2021/04/29 Python
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python