python 类内函数调用_python Special method names(类里的__xx__函数)

主要就是根据自己的理解翻译了部分http://docs.python.org/reference/datamodel.html#special-method-names里面的内容。还有很多没有翻译的。

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) 重载了< xy 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的时候调用

阅读(945) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值