zoukankan      html  css  js  c++  java
  • 【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 于南昌  

             



  • 相关阅读:
    找出数组中最长的连续数字序列(JavaScript实现)
    从数组中选出和等于固定值的n个数(JavaScript实现)
    比较任意两个JSON串是否相等(比较对象是否相等)JAVA版
    freshcodecolor纯正则实现的在线代码着色(高亮)
    最新QQ强制聊天代码,同时可判断好友关系
    (转)spring异常抛出触发事务回滚策略
    (转)Java回收对象的标记 和 对象的二次标记过程
    (转)调用System.gc没有立即执行的解决方法
    java线程池与五种常用线程池策略使用与解析
    (转)Spring事务管理详解
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211426.html
Copyright © 2011-2022 走看看