转自 http://www.cnblogs.com/BeginMan/p/3191037.html

一、类

类就是一个数据结构,封装了数据和操作。

类的声明与函数的声明十分类似:

class newClass(object):
"""class documentation string"""#类文档字符串
class_suite #类体

注意:类是对象(在Python中,一切皆对象),但是类在定义的时候,还不是对象的实现。

二、类属性

面向对象的编程和思想中,出现了类属性的概念。
在java中,类的实例变量静态变量称为类属变量(class‘s variables,常称为类变量)或数据域(java语言程序设计(基础篇)》,机械工业出版社,p185)。
面向对象的编程语言Python中,类属性就是在类中定义的变量
在C++中,类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性值是相同的。
不同的编程语言有不同的定义。而有些语言是不区分static类型的,所以并不能用static来表示这个属性是否为类属性。只不过用static修饰的属性可以实现对象间的数据共享而已。
属性:就是属于另一个对象的数据或函数元素。

在Python中一个有趣的现象是:当访问一个属性时,它同时也是一个对象。拥有它自己的属性可以访问,这就造成了一个属性链。

1、类的数据属性:

就是定义类的变量,即静态变量,或静态数据。它们与所属的类对象绑定,不依赖任何类实例。这里类型的数据相当于在变量前面加上static。

class newClass(object):
foo = 100 print newClass.foo #100
newClass.foo+=100
print newClass.foo #

类属性与实例属性不一样。

2、方法

方法也成为类属性。

3、查看类属性

使用内建函数dir()或类的字典属性__dict__都可以。

class newClass(object):
def foo(self):
pass
print dir(newClass)
#['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'foo']
print newClass.__dict__
#{'__dict__': <attribute '__dict__' of 'newClass' objects>, '__module__': '__main__', 'foo': <function foo at 0x00B00A30>, '__weakref__': <attribute '__weakref__' of 'newClass' objects>, '__doc__': None}

class newClass(object):
"""Python Class"""
def foo(self):
pass print newClass.__name__ #newClass
print newClass.__doc__ #Python Class
print newClass.__bases__ #(<type 'object'>,)
print newClass.__base__ #<type 'object'>
print newClass.__module__ #__main__
print newClass.__class__ #<type 'type'>

三、实例

1、关于类的实例

类是一种数据结构定义类型,那么实例就是声明这种类型的变量。

class newClass(object):
"""Python Class"""
def foo(self):
pass c = newClass()
print type(c) #<class '__main__.newClass'>,而在Python2.2版本之前,实例是”实例类型“从不考虑从哪个类来的
print type(0) #<type 'int'>
print type(newClass) #<type 'type'>
print type(int) #<type 'type'>两者都是类型

注意,在2.2版本之后,当定义一个新式类后,你已创建一个新的类型。

2、__init__() “构造器”方法

不通过new来创建实例,你也没有定义一个构造器,是Python为你创建对象

__init__()是在解释器为你创建一个实例后调用的第一个方法

如果没有定义(或覆盖)特殊方法__init__().则对实例不会施加任何特殊的操作。

3、__new__()“构造器”方法

与__init__()相比,__new__()则更像一个真正的构造器。

4、__del__()"解构器"方法

四、类属性与实例属性

参考:http://www.pythonfan.org/thread-9827-1-1.html

python中的类属性只是存储与类相关 的数据,和该类的实例无关。类属性和java中的静态成员变量类似。访问python的类属性可使用类名+“.”+属性名的方式,如果类的实例没有同名变 量也可以使用实例来访问。如果实例含有与类属性同名的属性,则用该实例访问属性时,访问的是实例中的属性。

class Test():
myVersion="1.0" #声明一个类属性,并赋值为1.0 t=Test() #生成一个实例
Test.myVersion #使用类空间来访问类属性 ,输出为 1.0
t.myVersion #使用实例空间来访问类属性,输出为1.0
Test.myVersion="2.0" #使用类空间来更新类属性
Test.myVersion #使用类空间来访问类属性 ,输出为 2.0
t.myVersion #使用实例空间来访问类属性,输出为2.0

只有使用类空间引用类属性时,才能设定和更新类属性。如果尝试使用实例空间来引用类属性来进行更新,则该实例(如果没有同名属性的话)会创建一个与该类属性同名的实例属性。该实例属性会阻止实例对类属性的访问,直到该实例的同名属性被清除掉。

t.myVersion='3.0' #实例t会创建一名为‘myVersion’的实例属性
Test.myVersion #输出2.0,上一条语句并不会对类属性产生任何影响
t.myVersion #输出3.0,t访问的是自身的实例属性
del t.myVersion #清除t的实例属性
t.myVersion #输出2.0,此时访问的是类属性

但是,在类属性可变的情况下,事情又不一样了

Test.x={'myVersion':'1.0'} #给Test类添加一个新的类属性
Test.x #用类空间访问该属性 输出 {'myVersion':'1.0'}
t.x #用实例空间访问该属性 输出 {'myVersion':'1.0'}
t.x['myVersion']='2.0'
t.x #输出{'myVersion':'2.0'}
Test.x #输出{'myVersion':'2.0'} # 实例t的更新操作对类属性生效了
del t.x #出错 :t instance has no attribute 'x'

Python学习(24):Python面向对象(2)的更多相关文章

  1. Python学习-24.Python中的算术运算

    加法:+,与C#中并无区别,并且一样可以作用于字符串. 但Python中不支持字符串与数值类型的相加. i = 1 s = ' print(s + i) 这样是会在运行时报错的,正确写法如下: i = ...

  2. Python学习day09 - Python进阶(3)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  3. Python学习day05 - Python基础(3) 格式化输出和基本运算符

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  4. python 学习笔记7 面向对象编程

    一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...

  5. 【python学习-5】面向对象的python

    python是一种面向对象的编程语言,虽然与C++一样,支持面向过程的程序设计,python完全可以使用函数.模块等方式来完成工作,但是当使用python编写一个较大的项目时,则应该考虑使用面向对象的 ...

  6. python学习笔记(7): 面向对象

    class Foo: #类中的函数 def bar(self): #功能阐述 print('Bar') pass def hello(self,name): print('i am %s' %name ...

  7. python学习之python开发环境搭建

    Python简介 Python是一种面向对象.解释型计算机程序设计语言.Python语法简洁而清晰,具有丰富和强大的类库等等众多的特性,这是来自百度百科的介绍,在百度百科还能看到它的更详细的介绍信息, ...

  8. python学习: 优秀Python学习资源收集汇总--转

    Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl ...

  9. python学习笔记--python简介

    一.什么是python? python是一种面向对象.解释型的高级程序语言.python具有语法简洁.易于学习.功能强大,可扩展性强,跨平台等诸多特点.1989年开始开发,于1991年发布第一个公开发 ...

  10. Python学习day07 - Python进阶(1) 内置方法

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

随机推荐

  1. Java如何显示小时和分钟?

    在Java中,如何显示小时和分钟(当前时间)? 此示例演示如何使用Calender类的Calender.getInstance()来显示某个时刻的小时和分钟. package com.yiibai; ...

  2. (原创)OpenStack服务如何使用Keystone(三)---详细配置Keystone中间件

    (一)Keystone端的操作 (二)如何在OpenStack服务上部署Keystone中间件 (三)详细配置keystonemiddleware 前文我们介绍了如何部署Keystone中间件以及中间 ...

  3. Websphere多个应用session相互覆盖问题解决办法

    原文链接:http://my.oschina.net/moyuqi/blog/98475 使用apache反向代理解决在应用A使用Iframe嵌入应用B的功能而产生的跨域问题后,应用B的功能能正常使用 ...

  4. win10上跑 sqlserver 2000应用程序

    将SQL Server 安装程序\X86\SYSTEM\SQLUNIRL.DLL 替换到Win10 的 C:\windows\system32\目录下,64位win10 还要复制到SYSWOW64目录 ...

  5. C# 线程安全与 lock锁

    如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的.  或者说:一个类或者 ...

  6. The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead [duplicate]

    From: http://stackoverflow.com/questions/13944956/the-mysql-extension-is-deprecated-and-will-be-remo ...

  7. VS2010 工程设置

       本篇文章的主要内容转载自 http://blog.csdn.net/waitforfree/article/details/8622059 ,感谢博主的辛苦劳动.此处,对比较重要的部分,进行进一 ...

  8. VCL 中的 Windows API 函数(4): AdjustWindowRectEx

    AdjustWindowRectEx 用在了 Forms.DBCtrls 单元. AdjustWindowRectEx 可以根据窗口样式获取的边缘尺寸. 测试: var   R: TRect; beg ...

  9. Java基础之深入理解Class对象与反射机制

    深入理解Class对象 RRIT及Class对象的概念 RRIT(Run-Time Type Identification)运行时类型识别.在<Thinking in Java>一书第十四 ...

  10. Alpine Linux:如何配置GUI的图形桌面环境:x Desktop Environment

    alpine linux 真是不错.小巧.迅捷! 官方的各个版本的alpine镜像内没有带图形环境的.那我们如何构建自己的桌面图形环境呢? 其实:这个问题,在起官网的wiki内有指南,我们根据那些相关 ...