zoukankan      html  css  js  c++  java
  • Python魔法方法__getattr__、__setattr__、__getattribute__的介绍

    一、__getarribute__方法

    __getattribute__(self, name):拦截所有的属性访问操作

    >>> class Person:
    ...     def __init__(self, name):
    ...             self.name = name
    ...     def __getattribute__(self, attr):
    ...             if attr == 'name':
    ...                     return '姓名:' + super().__getattribute__(attr)
    ...             else:
    ...                     return raise AttributeError('属性%s不存在!' % attr)
    ...
    >>> p = Person('韩晓萌')
    >>> p.name
    '姓名:韩晓萌'
    >>> p.age
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 属性age不存在!

    二、__getattr__方法

    __getattr__(self, name):拦截对不存在属性的访问操作

    >>> class Person:
    ...     def __init__(self, name):
    ...             self.name = name
    ...     def __getattr__(self, attr):
    ...             raise AttributeError('没有属性%s!' % attr)
    ...
    >>> p = Person('韩晓萌')
    >>> p.name
    '韩晓萌'
    >>> p.age
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 5, in __getattr__
    AttributeError: 没有属性age!

    三、__setattr__方法

    __setattr__(self, attr, value):拦截所有属性的赋值操作

    >>> class Person:
    ...     def __init__(self, name):
    ...             self.name = name
    ...     def __setattr__(self, attr, value):
    ...             if attr == 'name':
    ...                     if not isinstance(value, str):
    ...                             raise TypeError('name的值必须是字符串!')
    ...                     self.__dict__[attr] = value
    ...             else:
    ...                     super().__setattr__(attr, value)
    
    >>> p = Person(1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in __init__
      File "<stdin>", line 7, in __setattr__
    TypeError: name的值必须是字符串!
    >>> p = Person('韩晓萌')
    >>> p.name
    '韩晓萌'
    >>> p.name = 1
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 7, in __setattr__
    TypeError: name的值必须是字符串!
    >>> p.name = '杨超越'
    >>> p.name
    '杨超越'
    >>> p.age = 21
    >>> p.age
    21
  • 相关阅读:
    [vue/cli4] 目录public和asset区别
    VSCode常用指令
    [vue] JS导出Excel
    各设计模式总结与对比及Spring编程思想
    JavaIO演进之路
    用300行代码手写提炼Spring的核心原理
    设计模式(六)之装饰器模式(Decorator Pattern)深入浅出
    设计模式(五)之适配器模式(Adapter Pattern)深入浅出
    设计模式(四)之模板模式(Template Method Pattern)深入浅出
    设计模式(二)之委派模式(Delegate Pattern)深入浅出
  • 原文地址:https://www.cnblogs.com/hanxiaomeng/p/12711696.html
Copyright © 2011-2022 走看看