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中的tkinter模块作图的方法
Feb 07 Python
django开发之settings.py中变量的全局引用详解
Mar 29 Python
浅谈机器学习需要的了解的十大算法
Dec 15 Python
django允许外部访问的实例讲解
May 14 Python
django js实现部分页面刷新的示例代码
May 28 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
python多线程并发实例及其优化
Jun 27 Python
详解Python3 pandas.merge用法
Sep 05 Python
Python完全识别验证码自动登录实例详解
Nov 24 Python
Python实现RGB与HSI颜色空间的互换方式
Nov 27 Python
pandas和spark dataframe互相转换实例详解
Feb 18 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
Oct 14 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
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
小程序接入腾讯位置服务的详细流程
2020/03/03 Javascript
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
[49:08]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
介绍Python的@property装饰器的用法
2015/04/28 Python
python处理二进制数据的方法
2015/06/03 Python
python 日志增量抓取实现方法
2018/04/28 Python
解决Django migrate No changes detected 不能创建表的问题
2018/05/27 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
keras.layer.input()用法说明
2020/06/16 Python
python程序需要编译吗
2020/06/19 Python
Python如何将模块打包并发布
2020/08/30 Python
python字典与json转换的方法总结
2020/12/28 Python
python regex库实例用法总结
2021/01/03 Python
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
运动会开幕式解说词
2014/02/05 职场文书
企业管理毕业生求职信范文
2014/03/07 职场文书
汽车广告策划方案
2014/05/31 职场文书
煤矿安全生产标语
2014/06/06 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
战友聚会致辞
2015/07/28 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书
使用canvas实现雪花飘动效果的示例代码
2021/03/30 HTML / CSS
MySQL面试题讲解之如何设置Hash索引
2021/11/01 MySQL