zoukankan      html  css  js  c++  java
  • 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...
  • 相关阅读:
    随机数
    ASP .NET下的301重定向如何做
    网站外部链接建设方案
    解析ASP.NET WebForm和Mvc开发的区别
    委托、匿名委托和lambda表达式
    图片垂直居中
    jquery函数写法
    [转]函数方法常用的动词
    CSS Hack
    富文本编辑器
  • 原文地址:https://www.cnblogs.com/52forjie/p/8251759.html
Copyright © 2011-2022 走看看