Python的魔法函数系列 __getattrbute__和__getattr__

 
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

__metaclass__ = type

"""
__getattr__ 和 __getattribute__ 的区别
"""

class ClassName:
    def __init__(self, name, info={}):
        self.name = name
        self.info = info

    # def __getattribute__(self, item):
    #     """
    #     这个魔法函数也是针对属性的,但是它的特点是在__getattr__之前执行,而且无论你访问
    #     的属性是不是存在都返回这个函数里面的返回值。也就是你访问什么属性都返回一样的东西。
    #     所以这个方法尽量不要自己重写。
    #     :param item:
    #     :return:
    #     """
    #     return "HELLO"

    def __getattr__(self, item):
        """
        这个魔法函数式在你试图访问一个不存在的属性时调用的,如果没有这个魔法函数
        访问不存在的属性程序会报错,但是如果有这个函数你就可以加入逻辑处理,比如
        返回一个 None,或者打印一些提示内容,或者进行纠正,比如你的属性都是小写
        对方访问一个大写的,你这里就可以自动转换等
        :param item:
        :return: None  其实不加return默认也会返回None
        """
        return self.info.get(item)
        # print("not found.", item)
        # return None

if __name__ == "__main__":
    cn = ClassName("Tom", info={"sex": "F"})
    # 本身类里面没有sex这个属性,我们通过字典传递进去的,你可以使用 __getattr__ 魔法函数,其实它就是去 __dict__里面去找
    # 让他可以访问字典。
    print(cn.sex)
    print(cn.__dict__)

如果我们把__getattribute__取消注释再次执行

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

__metaclass__ = type

"""
__getattr__ 和 __getattribute__ 的区别
"""

class ClassName:
    def __init__(self, name, info={}):
        self.name = name
        self.info = info

    def __getattribute__(self, item):
        """
        这个魔法函数也是针对属性的,但是它的特点是在__getattr__之前执行,而且无论你访问
        的属性是不是存在都返回这个函数里面的返回值。也就是你访问什么属性都返回一样的东西。
        所以这个方法尽量不要自己重写。
        :param item:
        :return:
        """
        return "HELLO"

    def __getattr__(self, item):
        """
        这个魔法函数式在你试图访问一个不存在的属性时调用的,如果没有这个魔法函数
        访问不存在的属性程序会报错,但是如果有这个函数你就可以加入逻辑处理,比如
        返回一个 None,或者打印一些提示内容,或者进行纠正,比如你的属性都是小写
        对方访问一个大写的,你这里就可以自动转换等
        :param item:
        :return: None  其实不加return默认也会返回None
        """
        return self.info.get(item)
        # print("not found.", item)
        # return None

if __name__ == "__main__":
    cn = ClassName("Tom", info={"sex": "F"})
    # 本身类里面没有sex这个属性,我们通过字典传递进去的,你可以使用 __getattr__ 魔法函数,其实它就是去 __dict__里面去找
    # 让他可以访问字典。
    print(cn.sex)
    print(cn.__dict__)

两次结果都是HELLO

原文地址:https://www.cnblogs.com/yunxizhujing/p/10125733.html

时间: 2024-09-28 23:08:18

Python的魔法函数系列 __getattrbute__和__getattr__的相关文章

gj3 Python数据模型(魔法函数)

3.1 什么是魔法函数 类里面,实现某些特性的内置函数,类似 def __xx__(): 的形式. 不要自己定义XX,并不是和某个类挂钩的 class Company(object): def __init__(self, employee_list): self.employee = employee_list # 可迭代 def __getitem__(self, item): return self.employee[item] # 长度,实现了len函数 def __len__(self

python的魔法函数

hello, 大家好, 今天给大家分享一点python的魔法函数,即Python中自带双下划线的函数,虽然在大规模的软件开发中大家用的不多,当然除非你想被打(可以秀(装逼)一下), 虽然使用的不多, 但是要是能数量的运用它们的话, 没有点功力基础也是相当困难的, 正所谓没有扎实的基本功,即便南拳北腿,降龙十八掌,九阴白骨爪,乾坤大挪移全部了然于心,照样是花拳绣腿,百无一用 所以还是老老实实的把自己的基本功练好,面向对象玩的炉火纯青,其他的不过是稍加训练,跟卖艺的学几招也能称霸一片天.哈哈 牛吹的

python内置函数和魔法函数

内置方法:Python中声明每一个类系统都会加上一些默认内置方法,提供给系统调用该类的对象时使用.比如需要实例化一个对象时,需要调用该类的init方法:使用print去打印一个类时,其实调用的是str方法等等. init(self, …):初始化对象class,在创建新对象时调用.在方法里,可以初始化该对象的属性,否则调用其他时可能出“现has no attribute”错误: del(self):释放对象,在对象被虚拟机删除之前调用: new(cls,*args,**kwd):实例的生成操作,

python魔法函数之__getitem__

魔法函数会增强python类的类型,独立存在 class Company: def __init__(self, employees): self.employees = employees def __getitem__(self, item): return self.employees[item] company = Company(['a', 'b', 'c']) for val in company: print(val) company1 = company[:2] for val

如何在Python中快速画图——使用Jupyter notebook的魔法函数(magic function)matplotlib inline

如何在Python中快速画图--使用Jupyter notebook的魔法函数(magic function)matplotlib inline 先展示一段相关的代码: #we test the accuracy of knn and find the k which makes the biggest accuracy k_range=list(range(1,26))#[1,25] scores=[] for k in k_range: knn=KNeighborsClassifier(n_

python学习系列--python内置函数(一)

先列出所有的python内置函数,可以看到还是挺多的. abs()        求给定数的绝对值. all()          传入一个列表,只有当列表中所有元素都是真时,该函数返回真. any()        传入一个列表,只要列表中有一个元素为真,该函数即返回真. ascii()       执行对象中的__repr__方法.该函数在python2.7中已弃用. bin()         将给定的值转换成二进制. bool()       判断真假. bytearray()     

python魔法函数的一些疑问

看了魔法函数,有一点疑问.1中需要用self.word才能执行,而2直接用self就可以执行.而1中Word继承了int基本类型,但在__new__时并没有什么卵用.当用 Word(“123”)来实例化时,看到的运算结果是以字符串形式来进行运算的,比如“123”*3=123123123. 1. class Word(int): def __new__(cls, word): word = int(word) return int.__new__(cls,word) def __init__(se

009_python魔法函数

11. (译)Python魔法方法指南 原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英文版) Repo: https://github.com/RafeKettler/magicmethods Contents (译)Python魔法方法指南 简介 构造方法 操作符 比较操作符 数值操作符 一元操作符 常见算数操作符 反射算数运算符 增强赋值运算符 类型转换操作符 类的表示 访问控制

Python猫荐书系列之五:Python高性能编程

稍微关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非 Python 与 Go 莫属,于是,隔三差五就会有人问:这两种语言谁更厉害/好找工作/高工资-- 对于编程语言的争论,就是猿界的生理周期,每个月都要闹上一回.到了年末,各类榜单也是特别抓人眼球,闹得更凶. 其实,它们各有对方所无法比拟的优势以及用武之地,很多争论都是没有必要的.身为一个正在努力学习 Python 的(准)中年程序员,我觉得吧,先把一门语言精进了再说.没有差劲的语言,只有差劲的程序员,等真的把语言学好了,必定是"