python的 __等方法大全

1,__slots__


__slots__=('s1','s2')
初始化时,我们只能调用这里面是s1和s2字段或方法,别的方法都不能调用,就算在__init__设置了别的值,也不能调用

 2,__getattr__

拦截点号运算, 当对未定义的属性名称和实例对象进行点号运算时, 就会用属性名调用__getattr__方法, 
如果继承树能找到该类方法, 则执行已有方法

3,__setattr__属性.

会拦截所有属性的的赋值语句。如果定义了这个方法,self.arrt = value
就会变成self.__setattr__("attr", value).这个需要注意。当在__setattr__方法内对属性进行赋值是,不可使用self.attr = value,
因为他会再次调用self, __setattr__(
"attr", value), 则会形成无穷递归循环,最后导致堆栈溢出异常。
应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self.__dict__['name'] = value

 4,partial

partial 方法 对函数进行封装,封装过程中可以传递一个值,当封装后,再次进行运行时,则只需传一个值就行.
def f1(a1,a2):
print(a1 + a2)
f2=partial(f1,20)
f2(100)
==>120.

 5,__enter__  和 __exit__

2,class Foo:
  def __init__():
    print(11)
  def __enter__():
    print(222)
    return self
  def __exit__():
    print(333)
with Foo() as obj:
  print(444)
打印顺序==>   11,444 ,222,333,
因为有__enter__和__exit__方法,所有实例化要用with方法
并且,当进入__enter__后,一定要返回self给后面的方法用,不然会报错.

6,__new__

1,__new__执行在构造方法__init__之前
2,python默认用__new__创建类的实例,
3,最终结果要返回__init__方法,可以不返回当前类的实例,
4,__new__是类的静态方法,虽然没有加上装饰器

class Foo(object):
    def __init__(self, *args, **kwargs):
        ...
    def __new__(cls, *args, **kwargs):
        return object.__new__(cls, *args, **kwargs)    

# 以上return等同于
# return object.__new__(Foo, *args, **kwargs)
# return Stranger.__new__(cls, *args, **kwargs)
# return Child.__new__(cls, *args, **kwargs)
class Child(Foo): def __new__(cls, *args, **kwargs): return object.__new__(cls, *args, **kwargs)
# 如果Child中没有定义__new__()方法,那么会自动调用其父类的__new__()方法来制造实例,即 Foo.__new__(cls, *args, **kwargs)。
# 在任何新式类的__new__()方法,不能调用自身的__new__()来制造实例,因为这会造成死循环。因此必须避免类似以下的写法:
# 在Foo中避免:return Foo.__new__(cls, *args, **kwargs)或return cls.__new__(cls, *args, **kwargs)。Child同理。
# 使用object或者没有血缘关系的新式类的__new__()是安全的,但是如果是在有继承关系的两个类之间,应避免互调造成死循环,例如:(Foo)return Child.__new__(cls), (Child)return Foo.__new__(cls)。
class Stranger(object):
    ...
# 在制造Stranger实例时,会自动调用 object.__new__(cls)

通常来说,新式类开始实例化时,__new__()方法会返回cls(cls指代当前类)的实例,然后该类的__init__()方法作为构造方法会接收这个实例(即self)作为自己的第一个参数,
然后依次传入__new__()方法中接收的位置参数和命名参数。
class Foo(object):
    def __init__(self, *args, **kwargs):
        ...
    def __new__(cls, *args, **kwargs):
        return object.__new__(Stranger, *args, **kwargs)  

class Stranger(object):
    ...

foo = Foo()
print type(foo)    

# 打印的结果显示foo其实是Stranger类的实例。

# 因此可以这么描述__new__()和__ini__()的区别,在新式类中__new__()才是真正的实例化方法,为类提供外壳制造出实例框架,然后调用该框架内的构造方法__init__()使其丰满。
# 如果以建房子做比喻,__new__()方法负责开发地皮,打下地基,并将原料存放在工地。而__init__()方法负责从工地取材料建造出地皮开发招标书中规定的大楼,__init__()负责大楼的细节设计,建造,装修使其可交付给客户。

7,__call__方法

当类实例化后,也可以变成可调用对象,只要实现__call__方法
class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    def __call__(self, friend):
        print 'My name is %s...' % self.name
        print 'My friend is %s...' % friend
现在可以对 Person 实例直接调用:

>>> p = Person('Bob', 'male')
>>> p('Tim')
My name is Bob...
My friend is Tim...
原文地址:https://www.cnblogs.com/52forjie/p/8251759.html