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 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象 ...
随机推荐
- SUSE Linux实现局域网时间同步
0.前言 需求是这么来的,搭建了Storm集群进行协同过滤算法的计算性能测试,要求精度在毫秒(ms)级别.局域网内40个虚拟机节点,用 date 命令,精度上和效率上都不可行.所以,就搭建了 ...
- 遮罩层的实现(纯js兼容版)
这个代码是我以前测试时候的代码了,主要用到的知识点是opacity和filer分别实现 “标准浏览器”和IE浏览器下的半透明,使用js的document.body.offsetwidth 和scree ...
- C#通过FTP账号上传、修改、删除文件 FTPClient
下面类文件中,主要做的工作是:从ftp服务器上下载文件把本地文件替换.添加.或删除功能,在替换本地文件时会先备份一下本地的文件,若整个操作都完成了就会发出commit命令,表示全部替换成功.若中间操作 ...
- MySQLdb安装和使用2
http://blog.chinaunix.net/uid-8487640-id-3183185.html MySQLdb是Python连接MySQL的模块,下面介绍一下源码方式安装MySQLdb: ...
- tty、pty、pts等(小记)
http://blog.csdn.net/dbzhang800/article/details/6939742 1> tty(终端设备的统称):tty一词源于Teletypes,或者telety ...
- vmware9.0 安装ios10.8应该注意的地方
今天终于在我的thinkpad t400上面按照好了ios系统 我的硬件配置:cpu:p8700,内存:ddr3,6g 安装的版本:ios10.8 vmware的版本是vmware9.0 安装好的io ...
- web 版发送邮件-已删除
文章已被删除,如果不便,敬请谅解
- Linux学习笔记总结--配置iptables防火墙
将原有的iptables 文件保存一份 cp -p /etc/sysconfig/iptables /etc/sysconfig/iptables.bak 清空现有的规则 iptables -F ip ...
- GUI编程笔记(java)08:GUI通过鼠标移动到按钮上更改背景色案例
首先我们看看源代码如下: package cn.itcast_06; import java.awt.Button; import java.awt.Color; import java.awt.Fl ...
- Unity3D 关于声音MissingComponentException报错
如果你遇到报错如下: MissingComponentException: There is no 'AudioSource' attached to the "Level-2-bg&quo ...