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 28 Python
python中安装Scrapy模块依赖包汇总
Jul 02 Python
python3实现跳一跳点击跳跃
Jan 08 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 Python
python manage.py runserver流程解析
Nov 08 Python
Python sorted对list和dict排序
Jun 09 Python
python -v 报错问题的解决方法
Sep 15 Python
Python爬取股票信息,并可视化数据的示例
Sep 26 Python
Pandas中DataFrame交换列顺序的方法实现
Dec 14 Python
用python自动生成日历
Apr 24 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 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 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
PHP字符串的编码问题的详细介绍
2013/04/27 PHP
phpStorm+XDebug+chrome 配置详解
2019/04/01 PHP
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
Random 在 Python 中的使用方法
2018/08/09 Python
python通过链接抓取网站详解
2019/11/20 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
浅析matlab中imadjust函数
2020/02/27 Python
Python实现弹球小游戏
2020/08/01 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
大学生实习自我鉴定
2013/12/11 职场文书
企业节能减排实施方案
2014/03/19 职场文书
个人买房协议书范本
2014/10/06 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
2019学子的答谢词范本!
2019/07/05 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android