【python学习】之四、面向对象

作者: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 于南昌  

         



你可能感兴趣的:(【python学习】之四、面向对象)