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回调函数的使用方法
Jan 23 Python
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
python处理xml文件的方法小结
May 02 Python
Python中IP地址处理IPy模块的方法
Aug 16 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
python匿名函数lambda原理及实例解析
Feb 07 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
Apr 13 Python
在python中使用nohup命令说明
Apr 16 Python
python通过函数名调用函数的几种场景
Sep 23 Python
python try...finally...的实现方法
Nov 25 Python
Selenium关闭INFO:CONSOLE提示的解决
Dec 07 Python
PyCharm 配置SSH和SFTP连接远程服务器
May 11 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
php5.2时间相差8小时
2007/01/15 PHP
真正的ZIP文件操作类(php)
2007/07/21 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
jQuery 操作XML入门
2008/12/25 Javascript
jquery 新浪网易的评论块制作
2010/07/01 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
es6学习之解构时应该注意的点
2017/08/29 Javascript
基于js中style.width与offsetWidth的区别(详解)
2017/11/12 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
[01:05:40]VG vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Python中scatter函数参数及用法详解
2017/11/08 Python
PyQt5每天必学之工具提示功能
2018/04/19 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
python读文件的步骤
2019/10/08 Python
Python如何读写字节数据
2020/08/05 Python
OpenCV利用python来实现图像的直方图均衡化
2020/10/21 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
日本整理专家Marie Kondo的官方在线商店:KonMari
2020/06/29 全球购物
中学教师岗位职责
2013/11/26 职场文书
班委竞选演讲稿
2014/04/28 职场文书
《颐和园》教学反思
2016/02/19 职场文书
Python实现Hash算法
2022/03/18 Python
Java Spring读取和存储详细操作
2022/08/05 Java/Android