Python学习(24):Python面向对象(2)
转自 http://www.cnblogs.com/BeginMan/p/3191037.html
一、类
类就是一个数据结构,封装了数据和操作。
类的声明与函数的声明十分类似:
class newClass(object):
"""class documentation string"""#类文档字符串
class_suite #类体
注意:类是对象(在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)的更多相关文章
- Python学习-24.Python中的算术运算
加法:+,与C#中并无区别,并且一样可以作用于字符串. 但Python中不支持字符串与数值类型的相加. i = 1 s = ' print(s + i) 这样是会在运行时报错的,正确写法如下: i = ...
- Python学习day09 - Python进阶(3)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day05 - Python基础(3) 格式化输出和基本运算符
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- python 学习笔记7 面向对象编程
一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...
- 【python学习-5】面向对象的python
python是一种面向对象的编程语言,虽然与C++一样,支持面向过程的程序设计,python完全可以使用函数.模块等方式来完成工作,但是当使用python编写一个较大的项目时,则应该考虑使用面向对象的 ...
- python学习笔记(7): 面向对象
class Foo: #类中的函数 def bar(self): #功能阐述 print('Bar') pass def hello(self,name): print('i am %s' %name ...
- python学习之python开发环境搭建
Python简介 Python是一种面向对象.解释型计算机程序设计语言.Python语法简洁而清晰,具有丰富和强大的类库等等众多的特性,这是来自百度百科的介绍,在百度百科还能看到它的更详细的介绍信息, ...
- python学习: 优秀Python学习资源收集汇总--转
Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl ...
- python学习笔记--python简介
一.什么是python? python是一种面向对象.解释型的高级程序语言.python具有语法简洁.易于学习.功能强大,可扩展性强,跨平台等诸多特点.1989年开始开发,于1991年发布第一个公开发 ...
- Python学习day07 - Python进阶(1) 内置方法
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
随机推荐
- Eclipse初次java开发问题总结-3
上篇中提到解决的一个问题是mysql驱动报的: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link ...
- e770. 确定按钮租中已选的单选按钮
When you ask a button group for the currently selected radio button, it returns the selected radio b ...
- Winform控件学习笔记【第二天】——常用控件
背景:期末考试刚过就感冒了,嗓子火辣辣的,好难受.但是一想起要学习总结就打起精神来了,Winform控件网上也没有多少使用教程,大部分都是自己在网上零零散散的学的,大部分用的熟了,不总结会很容易忘得. ...
- Java SE 8 并发增强
1.原子值 java5开始,提供了一些原子操作的类,如AtomicInteger.AtomicLong等 这些类提供了诸如incrementAndGet这样的原子操作方法. 单数如果想进行复杂操作,则 ...
- win7下安装双系统Ubuntu14.04后开机没有win7,直接进入Ubuntu
开机进入Ubuntu后,打开命令端,输入: sudo update-grub 然后重启,则解决问题
- Mac OS终端中设置颜色高亮和自动补全
已测试通过,原文:http://blog.csdn.net/songjinshi/article/details/8945809 一.颜色高亮显示 针对terminal采用bash模式: 编辑 ~/. ...
- struts2危险漏洞解决方法
原创,bgy编写.2013-07-24 前文: 随着苹果开发者网站的沦陷,已经曝光一周的Apache Struts2漏洞再次成为热门话题,今天有消息称由于该漏洞被利用,淘宝的数据库已经被盗,尽管淘宝官 ...
- python unittest 1
今天开始研究python的unittest模块,为我们当前做的项目定制测试方案,包括unittest和自动化流程测试. python的unittest的基本使用方法如下: 1.import uni ...
- ubuntu14.04 允许root用ssh登录
重启ssh service ssh restart 查看ssh是否已安装 ssh进程 ps -e | grep ssh ssh占用端口 lsof -i:22 ssh服务已启动,但是用root账号无法连 ...
- 【QT学习】信号和槽机制
QT中发射信号使用 emit 来完成. 类要使用信号和槽机制,必须从QObject或者QObject子类继承.必须在类的定义中加上 Q_OBJECT 宏. 信号和槽连接时,参数类型必须相同. 关键字大 ...