Python入门笔记(25):Python面向对象(2)
添加时间:2013-7-15 点击量:
一、类
类就是一个数据布局,封装了数据和操纵。
类的声明与函数的声明十分类似:
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 #200
类属性与实例属性不一样。
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 0 x00B00A30>, __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
真正的心灵世界会告诉你根本看不见的东西,这东西需要你付出思想和灵魂的劳动去获取,然后它会照亮你的生命,永远照亮你的生命。——王安忆《小说家的十三堂课》
一、类
类就是一个数据布局,封装了数据和操纵。
类的声明与函数的声明十分类似:
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 #200
类属性与实例属性不一样。
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 0 x00B00A30>, __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
真正的心灵世界会告诉你根本看不见的东西,这东西需要你付出思想和灵魂的劳动去获取,然后它会照亮你的生命,永远照亮你的生命。——王安忆《小说家的十三堂课》