Chinaunix首页 | 论坛 | 博客
  • 博客访问: 126353
  • 博文数量: 67
  • 博客积分: 1510
  • 博客等级: 上尉
  • 技术积分: 680
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-29 11:22
文章分类

全部博文(67)

文章存档

2011年(10)

2010年(28)

2009年(29)

我的朋友
最近访客

分类: Python/Ruby

2010-07-21 14:20:33

主要就是根据自己的理解翻译了部分里面的内容。还有很多没有翻译的。

object.__new__(cls[, ...])
当创建类cls新的类实例的时候调用。__new__是一个静态函数。他的第一个参数是要创建的对象的类。剩下的参数传递给对象的构造表达式(构造表达式就是a = A(3))。__new__函数的返回值通常是cls类的实例.
典型的创建类的新实例的场景就是调用父类的__new__函数,通过super(currentclass, cls).__new__(cls[, ...])以及合适的参数。并且可以修改新创建的实例在返回他之前。
如果__new__返回cls类的一个新实例,接下来新实例的__init__函数将会被调用,__init__(self[, ...])。这其中self是新实例本身,剩下的参数是__new__里面除了cls之外的参数。
如果__new__没返回cls类的一个新实例,那这个新实例的__init__函数也不会被调用。
__init__(self[, ...])主要是用来使immutable类型(像int,str,tuple)来定制实例的创建。他通常在元类里面被重写,以定制类的创建。
#==================================
class A(object):
    def __new__(cls, a=3):
        print "in new"
        print a
        nobj = super(A, cls).__new__(cls, a)
        return nobj
       
    def __init__(self, a):
        print "in init"
        print a
       
a = A(5)

C:\>python test.py
in new
5
in init
5


class A(object):
    def __new__(cls, a=3):
        print "in new"
        print a
        nobj = super(A, cls).__new__(cls, a)
#        return nobj
       
    def __init__(self, a):
        print "in init"
        print a
       
a = A(5)

C:\>python test.py
in new
5
#==================================

object.__init__(self[, ...])
当对象被创建的时候调用。参数是传递给构造表达式的那些参数。如果父类有一个__init__函数,在这个类的__init__函数里面最好显式的调用父类的__init__函数,以确保这个类里面父类的相关属性都被初始化了。如:BaseClass.__init__(self, [args...])。作为一个强制的规定,__init__必须return None,如果不是这样就会在运行时抛出TypeError异常。

object.__del__(self)
当实例即将被销毁时调用。这个函数仍然会调用析构器。如果父类有一delete函数,子类中最好显式的调用父类的析构函数,以确保子类里面父类的部分被析构。

object.__repr__(self)
这个函数将被repr()这个python的内建函数调用,当用来将一个对象转换为字符串的时候使用。这个函数的返回值必须是一个对象。这个函数一般是在print object的时候调用的。如果这个类里面没有定义__str__函数,那么在str(object)的时候这个__repr__函数会被调用,来替代__str__

object.__str__(self)
这个函数和repr一样,只不过他是在str(object)的时候调用的。如果这个类没有定义__repr__函数,那么在print object的时候,__str__函数会被调用,来替代__repr__

object.__lt__(self, other)    重载了<     xobject.__le__(self, other)    重载了<=    x<=y calls x.__le__(y)
object.__eq__(self, other)    重载了==    x==y calls x.__eq__(y)
object.__ne__(self, other)    重载了!=    x!=y and x<>y call x.__ne__(y)
object.__gt__(self, other)    重载了>     x>y calls x.__gt__(y)
object.__ge__(self, other)    重载了>=    x>=y calls x.__ge__(y)
以上这些函数返回True或者False,但是也可以返回其他任意的值。

object.__cmp__(self, other)
如果类里面没有定义上面的那些比较函数,如果碰到比较,就调用这个函数

object.__hash__(self)
当调用hash(object)的时候调用

object.__nonzero__(self)
当调用bool(object)的时候调用,应该返回True,False,或者0,1

object.__unicode__(self)
当调用unicode(object)的时候调用。这个函数应该返回一个unicode对象。如果一个类没有定义这个函数,unicode(object)的时候就会调用__repr__或者__str__。__repr__或者__str__返回的string类型的对象,系统会自动转换成unicode类型的。

object.__getattr__(self, name)
当调用s = object.name的时候调用。并且name没有在类里面定义

object.__setattr__(self, name, value)
当调用object.name = value的时候调用。

object.__delattr__(self, name)
当调用del obj.name的时候调用这个函数
#============================================================
class A(object):
   
    a = 5
   
    def __setattr__(self, name, value):
        print "in setattr"
       
    def __getattr__(self, name):
        print "in getattr"
        return "aaa"
       
    def __delattr__(self, name):
        print "in delattr"
       
a = A()
s = a.name
print s
a.newname = 'abc'
del a.b
s = a.a   #a已经定义了,所以没有调用__getattr__函数

C:\>python test.py
in getattr
aaa
in setattr
in delattr
#============================================================

object.__getattribute__(self, name)
这个只有在新式类(从object或者type派生的类)里面有。和__getattr__基本上一样

object.__get__(self, instance, owner)
object.__set__(self, instance, value)
object.__delete__(self, instance)
以上三个是descriptor的内容

object.__call__(self[, args...])
当调用object(param, param1...)的时候调用

object.__len__(self)
当调用len(object)的时候调用

object.__getitem__(self, key)
当调用object[key]的时候调用

object.__setitem__(self, key, value)
当调用object[key] = value的时候调用

object.__delitem__(self, key)
当调用del object[key]的时候调用

object.__reversed__(self)
当调用reversed(object)的时候调用

object.__contains__(self, item)
当调用调用item in object的时候调用
阅读(606) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~