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的常见命令注入威胁
Feb 18 Python
python merge、concat合并数据集的实例讲解
Apr 12 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
对numpy中二进制格式的数据存储与读取方法详解
Nov 01 Python
对pandas处理json数据的方法详解
Feb 08 Python
python在回调函数中获取返回值的方法
Feb 22 Python
Python的log日志功能及设置方法
Jul 11 Python
django框架使用方法详解
Jul 18 Python
使用python接受tgam的脑波数据实例
Apr 09 Python
Python3如何判断三角形的类型
Apr 12 Python
python 多线程共享全局变量的优劣
Sep 24 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 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文本操作类
2006/11/25 PHP
PHP获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
javascript实现json页面分页实例代码
2014/02/20 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
微信小程序获取当前位置和城市名
2019/11/13 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
python中验证码连通域分割的方法详解
2018/06/04 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
python编写简单端口扫描器
2019/09/04 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
浅析Python迭代器的高级用法
2020/07/16 Python
python实现画图工具
2020/08/27 Python
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
KIKO美国官网:意大利的平价彩妆品牌
2017/05/16 全球购物
艺术用品:Arteza
2018/11/25 全球购物
俄罗斯童装网上商店:BebaKids
2020/06/06 全球购物
理货员的岗位职责
2013/11/23 职场文书
《都江堰》教学反思
2014/02/07 职场文书
乡镇纠风工作实施方案
2014/03/22 职场文书
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python