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 相关文章推荐
linux系统使用python监测网络接口获取网络的输入输出
Jan 15 Python
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
详解字典树Trie结构及其Python代码实现
Jun 03 Python
Python编程pygal绘图实例之XY线
Dec 09 Python
详解python的sorted函数对字典按key排序和按value排序
Aug 10 Python
Django集成CAS单点登录的方法示例
Jun 10 Python
python多线程实现TCP服务端
Sep 03 Python
Python实现代码统计工具
Sep 19 Python
什么是python的自省
Jun 21 Python
jupyter使用自动补全和切换默认浏览器的方法
Nov 18 Python
Python基于Faker假数据构造库
Nov 30 Python
python playwrigh框架入门安装使用
Jul 23 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的异常处理类Exception的使用及说明
2012/06/13 PHP
Php output buffering缓存及程序缓存深入解析
2013/07/15 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
详解Webpack+Babel+React开发环境的搭建的方法步骤
2018/01/09 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
sortable+element 实现表格行拖拽的方法示例
2019/06/07 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
详解python3中zipfile模块用法
2018/06/18 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
护理职业生涯规划书
2014/01/24 职场文书
触摸春天教学反思
2014/02/03 职场文书
工程建设实施方案
2014/03/14 职场文书
学校地质灾害防治方案
2014/06/10 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
初中地理教学反思
2016/02/19 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
JavaScript继承的三种方法实例
2021/05/12 Javascript
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python
用JS创建一个录屏功能
2021/11/11 Javascript