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中用PIL库批量给图片加上序号的教程
May 06 Python
python与C互相调用的方法详解
Jul 14 Python
python实现图片识别汽车功能
Nov 30 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
PyQt使用QPropertyAnimation开发简单动画
Apr 02 Python
python操作链表的示例代码
Sep 27 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
Oct 31 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 11 Python
python人工智能human learn绘图可创建机器学习模型
Nov 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
推荐文章系统(一)
2006/10/09 PHP
session在PHP大型web应用中的使用
2011/06/25 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
2011/12/31 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
京东优选小程序的实现代码示例
2020/02/25 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
python设置windows桌面壁纸的实现代码
2013/01/28 Python
Python中的并发编程实例
2014/07/07 Python
python 循环遍历字典元素的简单方法
2016/09/11 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
2018/08/01 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
web页面录屏实现
2019/02/12 HTML / CSS
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
口头翻译求职人自荐信
2013/12/07 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
支部鉴定材料
2014/06/02 职场文书
高一数学教学反思
2016/02/18 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
新手初学Java List 接口
2021/07/07 Java/Android