最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • python魔法方法有什么用

    正文概述    2020-01-29   152

    python魔法方法有什么用

    1、什么是魔法方法?

    魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动触发的。它们经常是两个下划线包围来命名的(比如 __init__,__lt__),Python的魔法方法是非常强大的,所以了解其使用方法也变得尤为重要!

    2、__init__(self[, ...]),__new__(cls[, ...]),__del__(self)

    (1)__init__ 构造器,当一个实例被创建的时候初始化的方法。但是它并不是实例化调用的第一个方法,__new__才是实例化对象调用的第一个方法,它只取下 cls 参数,并把其他参数传给 __init__。 __new__很少使用,但是也有它适合的场景,尤其是当类继承自一个像元组或者字符串这样不经常改变的类型的时候。

    (2)__new__ 使用时注意以下四点:

    a、__new__  是在一个对象实例化的时候所调用的第一个方法;

    b、它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法;

    c、__new__  返回一个构建的实例;

    d、__new__  决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则__init__ 不会被调用;

    e、__new__  主要是用于继承一个不可变的类型比如一个 tuple 或者 string。

    相关推荐:《Python平台》

    __new__实现单例模式(无论多少次实例化,结果都是同一个实例)

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

    比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

    举例:

    class Person(object):
      def __init__(self, name, age):
        self.name = name
        self.age = age
      def __new__(cls, *args, **kwargs):
        if not hasattr(cls,'instance'):
          cls.instance = super().__new__(cls)
        return cls.instance
    a = Person('p1',21)
    b = Person('p2',22)
    print(a == b, a.name == b.name)    # 这里的打印结果都是True,可见 a 和 b 都是同一个实例(实例 b 覆盖了实例 a)。
    # 单例作用:
      #第一、控制资源的使用,通过线程同步来控制资源的并发访问;
      #第二、控制实例产生的数量,达到节约资源的目的;
      #第三、作为通信媒介使用,也就是数据共享。比如,数据库连接池的设计一般采用单例模式,数据库连接是一种数据库资源。
    # 应用场景:
      #Python的logger就是一个单例模式,用以日志记录
      #线程池、数据库连接池等资源池一般也用单例模式
      #Windows的资源管理器是一个单例模式
      #网站计数器

    (3)__del__ 析构器,当实例被销毁时调用。

    3、__call__(self[,args ...]),__getitem__(self,key),__setitem__(self,key,value)

    (1)__call__ 允许一个类的实例像函数一样被调用,如下:

    class Person(object):
      def __init__(self, name, age):
        self.name = name
        self.age = age
        self.instance = add
      def __call__(self,*args):
        return self.instance(*args)
    def add(args):
      return args[0] + args[1]
    a = Person('p1', 20)
    print(a([1,2]))
    #这里将打印 3
    #可见当创建a这个对象之后,如果定义了__call__函数则对象是可以像函数一样调用的。

    (2)__getitem__ 定义获取容器中指定元素的行为,相当于self[key],如下:

    class Person(object):
      def __init__(self, name, age):
        self.name = name
        self.age = age
        self._registry = {
          'name': name,
          'age': age
        }
      def __call__(self, *args):
        return self.instance(*args)
      def __getitem__(self, key):
        if key not in self._registry.keys():
          raise Exception('Please registry the key:%s first !' % (key,))
        return self._registry[key]
    a = Person('p1', 20)
    print(a['name'],a['age'])
    #这里打印的是 'p1' 20
    #可见__getitem__使实例可以像字典一样访问

    (3)__setitem__ 设置容器中指定元素的行为,相当于self[key] = value 。

    4、__getattr__(self,name),__getattribute__(self,name),__setattr__(self,name,value),__delattr__(self,name)

    (1)__getattr__ ():当用户试图访问一个不存在属性时触发;

    (2)__getattribute__(): 当一个属性(无论存在与否)被访问时触发;

    (3)__setattr__ ():当一个属性被设置时触发;

    (4)__delattr__ ():当一个属性被删除时触发。

    class Person(object):
      def __init__(self, name, age):
        self.name = name
        self.age = age
        self._registry = {
          'name': name,
          'age': age
        }
      def __getattribute__(self, item):
        #注意此处不要再访问属性,如self.__dict__[item]
        #因为self.__dict__依然会被__getattribute__拦截,这样就会陷入死循环
        return object.__getattribute__(self,item)
      def __getattr__(self, item):
        print("don't have the attribute ",item)
        return False
      def __setattr__(self, key, value):
        self.__dict__[key] = value
    a = Person('p1', 20)
    print(a.cs)      #这里会打印 don't have the attribute cs 以及 False
    a.cs = '测试'     #这里设置该属性值为'测试'
    print(a.cs)      #这里将打印出'测试'

    起源地下载网 » python魔法方法有什么用

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元