python 简单谈谈“类”
文章出处:http://www.cnblogs.com/winstic/,请保留此连接
面向对象是python语言的一大特色,而类又是面向对象编程的核心
先来一段关于类的声明:
class myClass(object): # 继承object
"""It's my first class defined """ # 文档字符串
version = 1.0 # 静态成员
testlist = [1, 2, 3]
def __init__(self, nm = "john"):
"""constructor"""
self.name = nm
def showname(self):
"""display name"""
print "your name is: ", self.name
def showversion(self):
"""display version"""
print "The version is: ", self.version
在类中声明的静态变量(也叫类属性)version、testlist将被所有实例及类的方法show*所共享
在类的定义中又一个很明显的特点,每个函数都有一个参数self;什么事self呢?我们可以联想一下C++中的this指针,没错她们有类似的功能,在python中self是类实例的引用,请记住是类实例的引用而不是类本身,那么我想引用实际的类怎么办,当然没问题,可以使用self.__class__
__init__()
类实例修改属性值?
每个类实例只能修改自己的属性值,可以说在多个类实例中是互不影响的,但这有一个前提:该属性值必须是不可变对象(为什么?请继续看...)
虽然可以通过对象改变自己的属性值,但当您这么做的时候,请擦亮您的火眼金金,看清类属性是可变还是不可变的类型;当然如果您要改变类属性时可以使用类名.属性名 = ××××来实现;下面将简单分析不可变对象和可变对象在属性值改变情况下的区别:
>>> # 对不可变对象(number)操作,实例间互不影响
>>> test1 = myClass()
>>> test2 = myClass()
>>> test1.version = 2.0
>>> test1.showversion()
The version is: 2.0
>>> test2.showversion()
The version is: 1.0
>>> # 对可变对象(list)操作时,实例间同步更新
>>> test1.testlist[0] = 10
>>> test1.testlist
[10, 2, 3]
>>> test2.testlist
[10, 2, 3]
- 原因分析:
当改变类属性时,如果属性是immutable的,该属性会被复制出一个副本,存放在当前对象的__dict__中;而原始类本身对应的值并没有改变。
>>> test1.__dict__
{'version': 2.0, 'name': 'john'}
>>> test1.__class__.version
1.0
>>> test1.__class__.__dict__
dict_proxy({'__module__': '__main__', 'version': 1.0, '__init__': <function __init__ at 0x025FFAB0>, '__dict__': <attribute '__dict__' of 'myClass' objects>, '__weakref__': <attribute '__weakref__' of 'myClass' objects>, 'showversion': <function showversion at 0x025FFB30>, 'testlist': [10, 2, 3], '__doc__': "It's my first class defined ", 'showname': <function showname at 0x025FFAF0>})
而如果类属性值是可变的(mutable),因为还是在原内存地址中操作,并没有产生相应的副本,同时该值一旦改变会直接更改原始类中的对应属性值,进而影响其 他对类实例
>>> test1.testlist
[10, 2, 3]
>>> test1.__class__.testlist
[10, 2, 3]
>>> test2.testlist
[10, 2, 3]
所有当我们通过类实例更改类属性值时,要特别注意的是:看清类属性对象是否可变(mutable/immutable),以免产生不必要的错误。
python 简单谈谈“类”的更多相关文章
- 【转】简单谈谈python的反射机制
[转]简单谈谈python的反射机制 对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面 ...
- Python自定义线程类简单示例
Python自定义线程类简单示例 这篇文章主要介绍了Python自定义线程类,结合简单实例形式分析Python线程的定义与调用相关操作技巧,需要的朋友可以参考下.具体如下: 一. 代码 # - ...
- 简单谈谈Python中的几种常见的数据类型
简单谈谈Python中的几种常见的数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等 ...
- Python科普系列——类与方法(下篇)
书接上回,继续来讲讲关于类及其方法的一些冷知识和烫知识.本篇将重点讲讲类中的另一个重要元素--方法,也和上篇一样用各种神奇的例子,从原理和机制的角度为你还原一个不一样的Python.在阅读本篇之前,推 ...
- python基础——枚举类
python基础——枚举类 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单 ...
- Selenium + PhantomJS + python 简单实现爬虫的功能
Selenium 一.简介 selenium是一个用于Web应用自动化程序测试的工具,测试直接运行在浏览器中,就像真正的用户在操作一样 selenium2支持通过驱动真实浏览器(FirfoxDrive ...
- python中的类属性和实例属性
属性就是属于一个对象的数据或者函数,我们可以通过句点(.)来访问属性,同时 Python 还支持在运作中添加和修改属性. 我们先来看看类里面的普通字段: class Test(object): nam ...
- Python之Metaclass详解,Python之元类
本人Java程序员一枚,这几天闲来无事就自学了下Python,学到Metaclass感觉有点迷惑,就在网上查相关资料,在栈溢出(stackoverflow)网站上看到一个关于metaclass的回答, ...
- Python 内编写类的各种技巧和方法
Python 内编写类的各种技巧和方法 简介 有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象 ...
随机推荐
- PAT 1018. Public Bike Management
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- servlet中避免405错误的产生
父类Parent(相当于HttpServlet):service方法,用于处理任务分发,doGet.doPost方法用于报错 关注的是子类Son(servlet) 目的:杜绝错误的产生 方式 ...
- 课程助理For Windows(预览版,正方教务系统学生查分工具)
其实盖子已经开发了一个功能更强大的版本,但是那个版本依然基于正方系统,也就是说只要正方系统跪了或者张院士在网站上做点手脚,这个小工具就会失效. 今天给大家的版本虽然功能及其简单.界面极端丑陋,但是通过 ...
- uva 11195 Another queen (用状态压缩解决N后问题)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 解析xlsx文件---Java读取Excel2007
关于Java读取Excel2007的文章在Google.百度上搜索一下,没有太好的例子,实现的也不算太好.查看了一下Poi,最新的 POI 3.5 beta 4 支持读写 Excel2007和PPT2 ...
- 假设但是学习java入门,请离开SSH稍远
我觉得有点累了步行上班,我想买一辆自行车.结果去了一看,想2500片.旁边的人说,2500所有最好加一些钱,买一挖电. 遂问电动车价格,3500,决定买.却被告知不如加点钱买小踏板摩托划算.于是看摩托 ...
- Android 中 更新视图的函数ondraw() 和dispatchdraw()的区别
绘制VIew本身的内容,通过调用View.onDraw(canvas)函数实现 绘制自己的孩子通过dispatchDraw(canvas)实现 View组件的绘制会调用draw(Canvas canv ...
- mybatis0203 一对一查询 resultMap实现
resultType实现的时候先要确定po类(数据库类)满不满足要求,如果不满足就要自定义一个pojo类(工具类). resultMap提供一对一关联查询的映射和一对多关联查询映射,一对一映射思路:将 ...
- PureMVC(JS版)源码解析(四):Notifier类
上一篇博客中,我们解析了Observer(观察者)类,这一篇博客我们来讲Notifier(通知着)类.关于Notifier类,源码注释上有这么一段: * @class puremvc.Not ...
- SDWebImage 原理及使用
这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. SDWebImage 加载图片的流程 入口 setImageWi ...