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使用webbrowser浏览指定url的方法
Apr 04 Python
Python使用redis pool的一种单例实现方式
Apr 16 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
Pandas 按索引合并数据集的方法
Nov 15 Python
python 求某条线上特定x值或y值的点坐标方法
Jul 09 Python
Python 一键获取百度网盘提取码的方法
Aug 01 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
python写一个随机点名软件的实例
Nov 28 Python
Django 多对多字段的更新和插入数据实例
Mar 31 Python
详解python中的闭包
Sep 07 Python
Python源码解析之List
May 21 Python
Python turtle实现贪吃蛇游戏
Jun 18 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 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
jquery 指南/入门基础
2007/11/30 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
2013/04/02 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
关于React动态加载路由处理的相关问题
2019/01/07 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
layui的select联动实现代码
2019/09/28 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
JavaScript实现矩形块大小任意缩放
2020/08/25 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
Python中使用动态变量名的方法
2014/05/06 Python
Python生成随机密码的方法
2017/06/16 Python
为什么称python为胶水语言
2020/06/16 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
美国狗旅行和户外用品领先供应商:kurgo
2020/08/18 全球购物
高中历史教学反思
2014/02/08 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
销售顾问工作计划书
2014/09/15 职场文书
平安家庭事迹材料
2014/12/20 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
初中语文教师研修日志
2015/11/13 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers