一、类

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

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

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

newClass.foo+=100

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

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入门笔记(25):Python面向对象(2)的更多相关文章

  1. Python入门笔记(22):Python函数(5):变量作用域与闭包

    一.全局变量与局部变量 一个模块中,最高级别的变量有全局作用域. 全局变量一个特征就是:除非被删除,否则他们存活到脚本运行结束,且对于所有的函数都可访问. 当搜索一个标识符(也称变量.名字等),Pyt ...

  2. Python入门笔记(21):Python函数(4):关于函数式编程的内建函数

    一.关于函数式编程的内建函数 apply()逐渐被舍弃,这里不讨论 1.filter() #filter(func,seq) """纯Python描述filter函数&q ...

  3. Python入门笔记(20):Python函数(3):关于lambda

    一.lambda函数 1.lambda函数基础: lambda函数也叫匿名函数,即,函数没有具体的名称,而用def创建的方法是有名称的.如下: """命名的foo函数&q ...

  4. Python入门笔记(18):Python函数(1):基础部分

    一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/archive/2011/08/29/2153871.html 一般程序设计语言包含两种基本的抽象:过 ...

  5. Python入门笔记(14):Python的字符编码

    一.字符编码中ASCII.Unicode和UTF-8的区别 点击阅读:http://www.cnblogs.com/kingstarspe/p/ASCII.html 再推荐一篇相关博文:http:// ...

  6. Python入门笔记(19):Python函数(2):函数/方法装饰器

    一.装饰器(decorators) 装饰器的语法以@开头,接着是装饰器函数的名字.可选参数. 紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下: @decorator(dec_opt_ar ...

  7. PYTHON 学习笔记1 PYTHON 入门 搭建环境与基本类型

    简介 Python,当然大家听到这个名词不再是有关于像JAVA 一样的关于后台,我们学习Python 的目的在于对于以后数据分析和机器学习AI 奠定基础,Python 在数据分析这一块,可谓是有较好的 ...

  8. Python入门笔记——(1)数字与表达式

    一.算术运算 整除:// 取余:% 乘方:** (a ** b = pow(a, b)) 十六进制表示:0x...,八进制表示0... round(x [, n]):对x从小数点第n位取四舍五入结果, ...

  9. python学习笔记(一):python简介和入门

    最近重新开始学习python,之前也自学过一段时间python,对python还算有点了解,本次重新认识python,也算当写一个小小的教程.一.什么是python?python是一种面向对象.解释型 ...

随机推荐

  1. highcharts插件使用总结和开发中遇到的问题及解决办法

    这里使用的highchart是2014-01-09从官网下载的版本,版本号是3.0.8, 当过了几天后,发现版本号变成了3.0.9,不由得的感叹highchart的版本更新之快. 在jsp中使用hig ...

  2. WPF调用图片路径,或资源图片

    一.加载本项目的图片WPF引入了统一资源标识Uri(Unified Resource Identifier)来标识和访问资源.其中较为常见的情况是用Uri加载图像.Uri表达式的一般形式为:协议+授权 ...

  3. whoami 和 Who am i

    ① 两个命令在一般的情况下,似乎效果是一样的 ② 但是当你执行完su 命令切换用户后,就不一样了,who am i 显示最早login的账户,而whoami 显示切换后的账户 例如: -bash-3. ...

  4. 解决“com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536”问题(l转)

    同时在工程中引入了多个第三方jar包,导致调用的方法数超过了android设定的65536个(DEX 64K problem),进而导致dex无法生成,也就无法生成APK文件. 解决办法如下: 1.谷 ...

  5. sruts2:单个文件上传,多个文件上传(属性驱动)

    文件上传功能在Struts2中得到了很好的封装,主要使用fileUpload上传组件. 1. 单个文件上传 1.1 创建上传单个文件的JSP页面.显示提交结果的JSP页面 uploadTest1.js ...

  6. nginx server_name

    在我的机子了nginx的  server_name要配制成127.0.0.1才能用,否则就报错,刚试用nginx还不知道为什么,先记下来

  7. 将在本地创建的Git仓库push到Git@OSC

    引用自:http://my.oschina.net/flan/blog/162189 在使用git 处理对android的修改的过程之中总结的.但不完善 Git push $ git push ori ...

  8. [原]零基础学习在Android进行SDL开发系列文章

    [原]零基础学习SDL开发之移植SDL2.0到Android [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 [原]零基础学习SDL开发之在Android使用SDL2.0显示 ...

  9. MFC设置静态文本框,编辑框等控件背景和字体颜色

    在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载WM_CTLCOLOR消息的响应函数.此函数的原型:afx_msg HBRUSH OnC ...

  10. webpack+vue-loader 在单独.vue组件中使用sass-loader编译sass报错问题not a valid Win32 applictation

        如果webpack配置没有问题,在vue文件中编译sass/scss报上面的错误,大概是由于node-sass安装失败,重新卸载安装,   在国内安装node-sass失败的话,可以使用淘宝镜 ...