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的Django框架中的Context使用
Jul 15 Python
Fabric 应用案例
Aug 28 Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
使用python对文件中的单词进行提取的方法示例
Dec 21 Python
如何使用Python自动控制windows桌面
Jul 11 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
Aug 06 Python
Python笔记之工厂模式
Nov 20 Python
Python中的 ansible 动态Inventory 脚本
Jan 19 Python
基于spring boot 日志(logback)报错的解决方式
Feb 20 Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 Python
利用python实现汉诺塔游戏
Mar 01 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中file_get_contents高?用法实例
2014/09/24 PHP
php自定义apk安装包实例
2014/10/20 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
jquery简单体验
2007/01/10 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
Angularjs自定义指令Directive详解
2017/05/27 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
2019/04/22 Javascript
jQuery层叠选择器用法实例分析
2019/06/28 jQuery
Python脚本实现12306火车票查询系统
2016/09/30 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
Python的历史与优缺点整理
2020/05/26 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
高中生期末评语大全
2014/01/28 职场文书
新学期标语
2014/06/30 职场文书
护士节慰问信
2015/02/15 职场文书
小学班主任个人总结
2015/03/03 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书
mysql中关键词exists的用法实例详解
2022/06/10 MySQL