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 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象 ...
随机推荐
- HDU 5750 Dertouzos
Dertouzos Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- iOS9上的Universal Link实现(教程)
1.Universal Link 理解为苹果官方支持deeplink就行了 2.通过点击HTTP链接启动APP Web・iOS应用在支持Universal Link的前提下,当用户点击特点的链接时会自 ...
- WAMP不能启动MYSQL服务
突然不知道怎么整的,就把wamp的mysql服务整个不能启动,忧桑. 点击重启Mysql服务: PHP集成环境WAMP中MYSQL的服务wampmysqld无法启动,总是提示 错误1067:进程意外终 ...
- Qt4--加密日记本(子例化QMainWindow文本加密解密)
近来刚学习Qt4编程,想找个实例练习练习,于是产生了一个想法,就是怎么样做一个文本加密,这样,自己保存的一些文档可以通过软件 生成加密文本,到时候要看的时候,通过自己的软件读取就可以.既然有想法了,那 ...
- C++ Virtual介绍 分类: C/C++ 2015-06-16 21:36 26人阅读 评论(0) 收藏
参考链接:http://www.cnblogs.com/xd502djj/archive/2010/09/22/1832912.html 学过C++的人都知道在类Base中加了Virtual关键字的函 ...
- Oracle 数据库用户管理
Oracle 数据库用户管理 Oracle 权限设置 一.权限分类: 系统权限:系统规定用户使用数据库的权限.(系统权限是对用户而言). 实体权限:某种权限用户对其它用户的表或视图的存取权限 ...
- Linux TCP/IP parameters reference
This is a reference of IP networking parameters that are configurable as described in our linux twea ...
- hibernate相关知识
1.为什么要用Hibernate JDBC的优点 直接底层操作,提供了很简单.便捷的访问数据库的方法,跨平台性比较强.灵活性比较强,可以写很复杂的SQL语句. JDBC的缺点 因为JAVA是面向对象的 ...
- Android低功耗蓝牙(BLE)开发的一点感受
最近一段时间,因为产品的需要我做了一个基于低功耗蓝牙设备的Android应用,其中碰到了一些困难,使我深深体会到Android开发的难处:不同品牌,不同型号和不同版本之间的差异使得Android应用适 ...
- SpringMVC注解@RequestMapping
/** * GET 查询 * * @return 视图路径 */ @RequestMapping(value = {"/index&q ...