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__()

  这个函数很特殊,我们知道前后带有双下划线的表示python中的特殊方法,那么他有什么特殊呢,很快可以联想到构造函数(注意有区别哦)

  在类中经常会看到这样的方法,可以被当成构造函数,但又不同于其他语言的构造函数,它并不创建对象实例 ,仅仅只是对象创建后执行的第一个方法,主要目的是完成一些必要的初始化工作;

一般都会有一个系统默认的__init__(),什么都不做,

我们在__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),以免产生不必要的错误。

时间: 2024-10-29 19:09:19

python 简单谈谈“类”的相关文章

Python简单操作笔记

Python 类型转换 str(),repr()|format() : 将非字符类型转成子串 int() : 转为整形 float() : 转为浮点型 list(s) : 将字串s转成列表 tuple(s) : 将字串s转成元组 set(s) : 将字串s转成集合 frozenset(s) : 将字串s转成不可变集合 dict(s) : 创建字典 其d必须是(key,value)的元组序列; chr(x) : 将整形转成字符 ord(x) : 将字符转成整形 hex(x) : 将整形转换成16进

Python对象和类

Python 里的所有数据都是以对象形式存在的,对象是类的实例. 定义类(class) 使用class来定义一个类. 比如,定义一个cat类,如下: class Cat(): def __init__(self): self.name = name 创建两个cat类的实例cat1,cat2,如下: cat1 = Cat('mimi') cat2 = Cat('momo') 类中的__init__为初始化函数,在实例创建的时候执行.它的第一个参数必须是self. 继承 一个类可以继承另一个类,被继

简单谈谈Resource,Drawable和Bitmap之间的转换

一直接触这些东西,还是归个类整理一下比较好. Resource -> Drawable Drawable draw1 = this.getResources().getDrawable(R.drawable.icon); Drawable -> Bitmap 1. static Bitmap drawableToBitmap(Drawable drawable) // drawable 转换成bitmap { int width = drawable.getIntrinsicWidth();/

以魔兽世界为引言,探讨一下python里的类

Python学到类这里就是达到了第一个瓶颈,因为此时程序思考和阅读的路线就不再直观,而是要拐一个弯弯.当突破了这一段就会达到了一个新的高度,但是"类"主要还是应用于多对象的建立,在大程序中为了省事,往往需要"类"的概念.小程序.小脚本可以不使用. "类"相当于一个"模型",有了"模型"/"图纸",才能实例化把抽象的东西成为具体.所以说"类"里的东西要有共性,以著名网游

gtk+3.0的环境配置及基于gtk+3.0的python简单例子

/*********************************************************************  * Author  : Samson  * Date    : 06/25/2014  * Test platform:  *              Mint 15  *              GNU bash, version 4.2.45  * *************************************************

python 简单日志框架 自定义logger

转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 通常我们在构建 python 系统时,往往需要一个简单的 logging 框架.python 自带的 logging 框架的确十分完善,但是本身过于复杂,因此需要自行封装来满足我们的高(zhuang)端(b)需求 1. 常用的格式化字符串: 这是我比较常用的格式化字符串,不同的人可能有不同的习惯 1 # 第一种,月日年的输出 2 DEFAULT_DATE_FMT = '%a, %p %b %d

简述Python中的类与对象

Python中的类 类的定义 示例: class Person: country = "China" def __init__(self, name, age): self.name = name self.age = age def speak(self, word): print(word) 其中 country 是类属性,即 Person类 的静态属性,speak() 为 Person类的函数属性,即类的动态属性~ 类的实例化 对上述示例的类进行实例化: >>>

python中新式类和经典类

python中的类分为新式类和经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要. Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Python 3.x中默认都是新式类,不必显式的继承object 2.经典类继承深度优先,新式类继承广度优先. 在多重继承关系下,子类的实例对象想要调用父类的方法,向上寻找时的顺序. 3.新式类相同父类只执行一次构造函数,经典类重复执行多次. class A: def __init__(self): pri

【转】Python 之 元类

原文链接: https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python      http://python.jobbole.com/21351/ 以下代码测试环境为ptyon2.7 类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>&