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多进程编程下线程之间变量的共享问题
May 05 Python
Python中的anydbm模版和shelve模版使用指南
Jul 09 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
Oct 01 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
Python获取网段内ping通IP的方法
Jan 31 Python
python3+PyQt5 数据库编程--增删改实例
Jun 17 Python
利用Python实现Shp格式向GeoJSON的转换方法
Jul 09 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 Python
Python实现大数据收集至excel的思路详解
Jan 03 Python
python geopandas读取、创建shapefile文件的方法
Jun 29 Python
Python3.8官网文档之类的基础语法阅读
Sep 04 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_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
thinkphp分页集成实例
2017/07/24 PHP
JQuery小知识
2010/10/15 Javascript
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
javascript 弹出层组件(升级版)
2011/05/12 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
一文快速详解前端框架 Vue 最强大的功能
2019/05/21 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
Python的Flask框架中Flask-Admin库的简单入门指引
2015/04/07 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
python实现画出e指数函数的图像
2019/11/21 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
python爬虫基础之urllib的使用
2020/12/31 Python
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
Ibatis如何调用存储过程
2015/05/15 面试题
毕业生自我鉴定范文
2013/11/08 职场文书
《美丽的小路》教学反思
2014/02/26 职场文书
我的梦想演讲稿
2014/04/30 职场文书
建筑工程技术专业求职信
2014/07/16 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
信用卡催款律师函
2015/05/27 职场文书