作者:jofranks 原创作品,转载请标明出处!版权所有,侵权必究!
来源:http://blog.csdn.net/jofranks
类与实例
类是对象的定义,而实例是“真正的实物”,它存放了类中所有定义的对象的具体信息!!!
创建一个实例的过程称作实例化!
类名通常由大写字母打头,这可以帮助你来识别类!
类:
class ClassName(bases): 类文档字符串 类体
上面就是我们在python中定义类的形式!创建一个类实际上你也是创建了一个自己的数据类型! 你也可以创建一个子类
创建子类,基类是一个或多个用于继承的父类的集合。
类体由所有声明语句,类成员定义,数据属性和函数组成!
要注意的是,在python中并没有像C++那样的虚函数,这要你自己在子类中定义方法!
类的数据属性:
就是你所定义的类的变量
>>> class C(object): foo = 10 >>> print C.foo 10 >>> C.foo = C.foo + 1 >>> print C.foo 11
看到上面的代码大家应该会用了吧!
Methods:
>>> class C(object): def myFun(self): print 'a' >>> m = C() >>> m.myFun() a >>> myFun() Traceback (most recent call last): File "<pyshell#19>", line 1, in <module> myFun() NameError: name 'myFun' is not defined
OK,看到代码大家应该知道怎么用了吧,和C++一样,你不通过实例来调用类方法,那么就会给你报错的!对了,还有一个得看一下,那就是:
>>> C.myFun() Traceback (most recent call last): File "<pyshell#20>", line 1, in <module> C.myFun() TypeError: unbound method myFun() must be called with C instance as first argument (got nothing instead)
这为什么会报错,因为python为了保持一致,要求:没有实例,方法是不能被调用的!方法必须绑定到一个实例才能直接被调用!
现在,类里面有属性了,但是我们想知道类里面的属性有哪些,我们有两种方法:
1、使用dir()内建函数,这个最简单了!
2、通过访问类的字典属性__dict__,这是所有类都具备的特殊属性之一!
>>> dir(C) ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'myFun'] >>> print C.__dict__ {'myFun': <function myFun at 0x02A0C530>, '__dict__': <attribute '__dict__' of 'C' objects>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'C' objects>, '__doc__': None}
dir()返回的仅是对象的属性的一个名字列表,而__dict__返回的是一个字典,其中键是属性名,值是相应的属性对象的数据值。OK,大家清楚了吧!
>>> C.__name__ 'C' >>> C.__doc__ >>> C.__bases__ (<type 'object'>,) >>> C.__class__ <type 'type'>
>>> s = type('stringts') >>> s <type 'str'> >>> s.__name__ 'str'
实例:
声明了一种类型的变量!
实例化的实现前面我们已经见到过了!
class ClassName(object): pass m = ClassName()
__init__():
实例化的第一步是创建实例对象,一旦对象创建了,那么就要检查是否实现了__init__()方法了! 如果没有定义, 不会对实例施加任何特别的操作! 需要特定的操作那就需要程序员去实现__init__(),否则不去实现那么就他的对象!
在这里,你没有用new来创建实例,python为你创建了对象!、
要记住,他不能有返回值!
__new__():
他必须返回一个合法的实例, 他像一个构造器, 他会调用父类的__new__()来创建对象!
__del__():
python中有垃圾对象回收机制, 这个函数是直到该实例对象所有的引用都被清除掉后才执行!
前面的函数相当于构造,这里相当于析构!
解构器只能被调用一次,一旦引用计数为0,那么对象就被清除了!
>>> class Mycount(object): count = 0 def __init__(self): Mycount.count += 1 def __del__(self): Mycount.count -= 1 def howmany(self): return Mycount.count >>> a = Mycount() >>> b = Mycount() >>> Mycount.count 2 >>> a.howmany() 2 >>> del a >>> b.howmany() 1 >>> del b >>> Mycount.count 0
实例属性:
这是Python的优秀特性,能在“运行时”创建实例属性! python不仅是动态类型,而且在运行时允许这些对象属性的动态创建! 这个是在C++ 或是 java中不存在的事情!
>>> class C(object): pass >>> c = C() >>> c.foo = 'a' >>> c.pas = 'd' >>> c.__dict__ {'foo': 'a', 'pas': 'd'} >>> c.__class__ <class '__main__.C'>
上面的__class__是返回实例化对象的类~!
实力属性PK类属性:
实例属性和类属性类似于自动变量和静态变量!
类属性仅仅是与类相关的数据值,和实例属性不同,类属性和实例无关!
类属性可以通过类或者实例来访问,下面的例子中我们可以通过C.a来访问类属性,当然也可以通过实例c来访问类属性a了!
>>> class C(object): a = 1 >>> C.a 1 >>> c = C() >>> c.a 1 >>> c.a += 1 >>> c.a 2不过上面的代码你下面再用C.a时他的结果就不是2了 他返回了1,这就是副作用来了!因为c只是创建了一个实例属性而已,没有改变类属性! 如果你把类属性删掉了,c.a也是可以访问的 结果还是2,但是C.a就不能访问了!
但是 但是:
>>> C.x = {2:'s'} >>> c = C() >>> c.a 1 >>> c.x {2: 's'} >>> c.x[123] = 'ddd' >>> C.x {2: 's', 123: 'ddd'}
我在类中添加了一个可变的变量! 这下,我通过实例改变类属性,C.x也跟着变了!
self:
self变量用于在实例方法中引用方法所绑定的实例!方法的实例在任何方法调用中总是作为第一个参数传递的,self被选中用来代表实例! 如果你的方法中没有用到self那么请考虑创建一个常规函数,除非你有特别的原因!在其他语言中,self被称为this~~!
静态方法与类方法:
通常的方法需要一个实例(self)作为第一个参数,并且对于方法调用来说self是自动传递给这个方法的!
而对于类方法而言,需要类而不是实例作为第一个参数!
staticmethon()和classmethod()方法:
>>> class StaticClass: def foo(): print 'static' foo = staticmethod(foo) >>> class ClassClass: def foo(cls): print 'classmethod name is:', cls.__name__ foo = classmethod(foo) >>> a = StaticClass() >>> a.foo() static >>> b = ClassClass() >>> b.foo() classmethod name is: ClassClass
OK!通过代码可以清楚地看到!
-------2012/7/31
-------jofranks 于南昌