首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python自学成才之路 魔术方法之属性访问控制

属性访问魔术方法 __getattr__(self, item) __getattribute__(self, item) 其中__getattr__只有在属性不存在时会被调用,__getattribute...__setattr__('age', 2020 - value) else: # 必须加上这一步 否则所有的属性添加都会失败 super(...(item + "属性不存在") AttributeError: age属性不存在 案例中__setattr__方法控制添加属性和给属性赋值的过程,通过birth_date属性来计算出age属性的值。...在使用这些访问控制魔术方法需要注意一点,不能通过self.xxx(备注:这里指的是访问控制魔术方法)的方式来访问,这样可能会导致死循环。...__getattribute__会调用自身,所以就出现了死循环。通过supr(Person, self)来调用_XXX_(备注:这里指访问控制魔术方法)可以避免递归调用。 也有人通过self.

54420

打破疑惑:一次搞懂hasattr()、getattr()、setattr()在Python中的应用

简介在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询。...如果不提供default参数,并且属性不存在,将会抛出AttributeError异常。...我们通过getattr()函数获取了person对象的属性name和age的值,并且为属性gender设置了默认值为"Unknown",因为该属性在person对象中不存在。...注意事项在使用hasattr()、getattr()和setattr()函数时,需要注意以下几点:hasattr()函数用于检查对象是否具有特定属性,可以帮助我们避免在获取属性值或设置属性时出现AttributeError...getattr()函数在获取属性值时,如果属性不存在且没有提供默认值,则会抛出AttributeError异常,因此建议使用hasattr()函数预先检查属性是否存在。

51640
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    解剖 Python 类

    变量和属性 | variable & attributes 变量,指的是在进行 Python 编码的过程中为某个具体对象赋予的名称。 属性也是变量,但属性不会单独出现。...我们在称呼一个变量为属性的时候一般会称其为某某对象的属性。当然在一些常见场景中,为了方便称呼会省略定语「某某对象的」,但省略不代表没有。...仅从当前展示的代码还比较难理解 CPython 中 Python 类的实现思路,需配合后文中类型的 CPython 源码分析才能更全面的理解 Python 中那些底层的特性是为何表现出来的。...__self__) # 4493634912 定义在类中的函数会在类对象实例化后化作实例对象中绑定方法的 __func__ 属性; 方法会将自己绑定的实例对象存放在 __slef__ 属性中; 绑定方法在执行时会将...以上,方法在无形中将 self 传入到了函数中。

    36320

    带你深入理解Python属性查找

    如果类定义了getattr方法,那么在getattribute抛出AttributeError的时候就会调用到getattr,而对于描述符(__get__)的调用,则是发生在getattribute内部的...obj=Clz(),那么obj.attr顺序如下: (1)如果“attr”是出现在Clz或其基类的dict中,且attr是datadescriptor,那么调用其get方法,否则 (2)如果“attr”...出现在obj的dict中,那么直接返回obj.dict[‘attr’],否则 (3)如果“attr”出现在Clz或其基类的dict中 (3.1)如果attr是non-datadescriptor,那么调用其...在TestClz中,用cached_property装饰方法complex_calc,返回值是一个descriptor实例,所以在调用的时候没有使用小括号。...因此:对于属性赋值,obj=Clz(),那么obj.attr=var,按照这样的顺序: 如果Clz定义了setattr方法,那么调用该方法,否则如果“attr”是出现在Clz或其基类的dict中,且attr

    76290

    Python中反射

    参考链接: Python中的反射 反射  运行时,区别于翻译时,指的是程序被加载到内存中执行的时候。 反射,reflection,指的是运行时获取类型定义信息。...简单说,在Python中,能够通过一个对象,找出其type、class、attribute或method的能力,称为反射或自省。...,name[,default])通过name返回object的属性值,当属性不存在,将属性不存在,将使用default返回,如果没有default,则抛出AttributeError,name必须是字符串...__dict__) print(p1.x)  实例通过.点号设置属性,例如self.x=x,就会代用__setattr__(),属性要加到实例的__dict__中,就需要自己完成。...异常  它的return值将作为属性查找的结果如果抛出AttributeError异常,则会直接调用__getattr__方法,因为属性没有找到 __getattribute__方法中为了避免在该方法中无线递归

    87200

    transactionscope mysql_c# – 嵌套的TransactionScope在测试中失败

    我正在尝试在我的数据库访问类库中使用TransactionScope在需要时执行回滚.另外,在我的测试代码中,我希望在每次测试之前使用TransactionScope将数据库恢复到已知状态.我使用TestInitialize...函数中构造TransactionScope对象,我相信我应该得到一个新的事务范围(没有“环境”存在,所以我相信这个“​​.RequiresNew”在技术上并不重要“.required”会产生相同的结果....我的测试安排使这个DoOtherDessertStuff函数失败并抛出异常,所以调用transScope.Complete();不会发生,并且在退出AddDessert函数中的using块时会自动进行回滚...,然后仍然在我的测试代码中检查我的Asserts....但我发现我得到以下错误: System.IO.IOException:无法从传输连接读取数据:连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接的主机无法响应而建立的连接失败. 想法?

    2.1K10

    测试开发进阶(六)

    面向对象编程的三大特征:封装,集成,多态 封装:将数据和方法放在一个类中 继承:python中的一个类可以继承于一个或多个类,被继承的叫父类(基类,base class),继承的类叫子类 多态:一类事物拥有多种形态...开放封闭原则 对于一个变量,只需要知道它是Base类型,无需确切地知道它的子类型,就可以调用run()方法(调用方只管调用,不管细节) 当需要新增功能,只需要新增一个Base的子类实现run(),就可以在原来的基础上进行扩展...__dict__) # {'name': 'zx', 'age': 18} AttributeError: 'Hero' object has no attribute '__dict__' """...__getattribute__(self, item) AttributeError: 'Hero' object has no attribute 'name1' """ getattr:如果属性不存在...,getattribute报AttributeError错误,该方法会主动捕获异常 class Hero(object): def __init__(self, name): print

    37230

    详解Flask上下文

    上下文是在Flask开发中的一个核心概念,本文将通过阅读源码分享下其原理和实现。...在Flask中,对一个请求进行处理时,视图函数一般都会需要请求参数、配置等对象,当然不能对每个请求都传参一层层到视图函数(这显然很不优雅嘛),为此,设计出了上下文机制(比如像我们经常会调用的request...Werkzeug的LocalStack是栈结构,在 globals.py中定义: _request_ctx_stack = LocalStack() _app_ctx_stack = LocalStack...实现了栈的push、pop和获取栈顶数据的top数据 整个类基于Local类,在构造函数中创建Local类的实例_local,数据是push到Werkzeug提供的Local类中 定义__call__方法...__ident_func__()][name] except KeyError: raise AttributeError(name) def __setattr

    88330

    深入理解 Python 的属性查找

    今天我们了解下python的属性查找,在Python中,属性查找(attribute lookup)是比较复杂的,特别是涉及到描述符descriptor的时候。...如果类定义了getattr方法,那么在getattribute抛出 AttributeError 的时候就会调用到getattr,而对于描述符( __get__ )的调用,则是发生在getattribute...官网文档是这么描述的 obj = Clz(), 那么obj.attr 顺序如下: (1)如果“attr”是出现在Clz或其基类的dict中, 且attr是data descriptor, 那么调用其get...方法, 否则 (2)如果“attr”出现在obj的dict中, 那么直接返回 obj.dict[‘attr’], 否则 (3)如果“attr”出现在Clz或其基类的dict中 (3.1)如果attr是non-data...因此:对于属性赋值,obj = Clz(), 那么obj.attr = var,按照这样的顺序: 如果Clz定义了setattr方法,那么调用该方法,否则 如果“attr”是出现在Clz或其基类的dict

    994100
    领券