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

有效的python属性管理:描述符的使用

但是在Python中我们一般都是直接从public属性写起,但是当我们对属性有特殊需求,例如进行类型验证(Python是动态类型),数值范围检测,返回深复制(而不是引用)的时候,我们一般会考虑使用: 内建的...为了能够在对属性进行赋值的时候进行相应的类型检测,我就定义了几个基本类型的描述符,提供了检测数据类型的相应逻辑,下面是个简单的整型描述符(当然这不是最后的使用的版本): class Float(object...当我试图向其赋值一个字符串时,便会抛出异常: ? 描述符的原理 上面进行了基本的描述符创建和使用效果,那么描述符是如何工作的才能让我们以这种方式操作属性呢?...描述符触发 当我们进行属性访问时便会触发描述符(如果这个属性具有描述符定义的时候),当我们对对象obj的属性d进行访问时候,obj.d,描述符的触发过程大致:先在对象obj的字典中寻找d,如果d是个含有...因此我在定义自己的描述符__get__()的时候进行了判断是否该相应的实例属性已经初始化,若未初始化则进行初始化,若已初始化直接返回,达到了惰性访问的目的: def __get__(self, instance

81990

彻底搞懂Object.defineProperty

昨天,在我通读vue文档过程中,一篇名为深入响应式原理吸引了我的注意,文中简述了vue数据响应式的原理,以及在操作数组与对象时需要注意的点,在实现上vue也使用了Object.defineProperty...方法,联想到vue计算属性的getter与setter,我想是时候弄懂这个API了,那么请各位跟随我的脚步,好好认识这个在JavaScript中高频出现的API,本文开始。...那大家有没有想过这种情况,赋值时我提供1,但取值我希望是2。巧了,这种情况我们就可以使用Object.defineProperty()中的存取描述符来解决这个需求。...说直白点,存取描述符给了我们赋值/取值时数据劫持的机会,也就就是在赋值与取值时能自定义做一些操作, getter函数在获取属性值时触发,注意,是你为某个属性添加了getter在获取这个属性才会触发,如果未定义则为...setter函数在设置属性时触发,同理你得为这个属性提前定义这个方法才行,设置的值将作为参数传入到setter函数中,在这里我们可以加工数据,若未定义此方法默认也是undefined。

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

    彻底搞懂 Object.defineProperty

    昨天,在我通读vue文档过程中,一篇名为深入响应式原理吸引了我的注意,文中简述了vue数据响应式的原理,以及在操作数组与对象时需要注意的点,在实现上vue也使用了Object.defineProperty...方法,联想到vue计算属性的getter与setter,我想是时候弄懂这个API了,那么请各位跟随我的脚步,好好认识这个在JavaScript中高频出现的API,本文开始。...那大家有没有想过这种情况,赋值时我提供1,但取值我希望是2。巧了,这种情况我们就可以使用Object.defineProperty()中的存取描述符来解决这个需求。...说直白点,存取描述符给了我们赋值/取值时数据劫持的机会,也就就是在赋值与取值时能自定义做一些操作, getter函数在获取属性值时触发,注意,是你为某个属性添加了getter在获取这个属性才会触发,如果未定义则为...setter函数在设置属性时触发,同理你得为这个属性提前定义这个方法才行,设置的值将作为参数传入到setter函数中,在这里我们可以加工数据,若未定义此方法默认也是undefined。

    79320

    Java 方法实参是传值(pass-by-value)还是传引用(pass-by-reference)?

    一直以来,我认为在 Java 中传递方法实参时,当传入的类型为基本数据类型时,则传入的是值;当传入的类型为对象时,则传入的是引用。但是,这个观念是实际上是错误的。事实上,Java 始终传递值。...通常来说,我们认为 Java 对对象传递引用的原因是当我们在方法内修改一个对象内部的状态时,(与 C++ 直接传递对象类型时不同,)这个对象的值的改变会传递到外部,就像这样: public class...经过一番查找,我在这篇文章中得到了答案: Java is officially always pass-by-value....事实上,Java 在传递引用类型时,传入的不是引用类型本身,而是引用类型的引用,对于这个引用类型的引用,Java 是按值传递的,这也就是意味着,Java 事实上从栈区域复制了一份对象的引用,传递给了方法...因此,当我们试图修改传入的这个复制份的“引用类型的引用”时,原本的引用并不会产生任何改变。

    95540

    Python(六)

    在 Python 中,面向对象还有很多高级特性,允许我们写出非常强大的功能。本篇,我们会说说多重继承、定制类等概念。...,负责把一个 setter 方法变成属性赋值,还可以定义只读属性,只定义 getter 方法,不定义 setter 方法就是一个只读属性。...在设计类的继承关系时,通常,主线都是单一继承下来的,但是,如果需要”混入”额外的功能,通过多重继承就可以实现,这种设计通常称之为 MixIn。 Python 自带的很多库也使用了 MixIn。...,比如,取第 5 个元素: Fib()[5] # TypeError: 'Fib' object does not support indexing 要表现得像 list 那样按照下标取出元素,需要实现...L.append(a) a, b = b, a + b return L __getattr__ 之前说过,当我们调用类的方法或属性时

    50710

    Python 进阶指南(编程轻松进阶):十七、Python 风格 OOP:属性和魔术方法

    当我们用属性的名称创建一个属性时,我们可以使用前缀下划线来重命名属性,我们的程序仍然会像以前一样工作。...当我们探索许多不同类型的魔术方法时,我们将扩展我们的WizCoin类来利用它们。...当我们将purse中的WizCoin对象传递给repr()和str()函数时,Python 在幕后调用WizCoin类的__repr__()和__str__()方法。...在wizcoin.py中,我决定使用knuts中的对象值,因为它使行为与WizCoin对象与整数和浮点数的比较一致。这些是你在设计自己的类时必须做出的决定。...比较数据库方法的完整文档在docs.python.org/3/reference/datamodel.html#object.__lt__的 Python 文档中。

    65720

    20180803_ARTS_week06

    这个时候监控系统并不知道这个接口或者服务出错了,所以抛出一个异常,是更好的做法。 尽可能使用最特定的类型。 主要是从发现错误的数据,以及当发现数据有问题时提前报错。...而且最特定的类型就是函数的签名,也是函数最好的注释。 使用 Optionals 代替 null。 这里主要是根据 Java 8 的 Optional 特性来说的。...Tip 介绍下 ES5 中 Object.freeze() 方法。...__proto__ = { x: 20 } 在 Vue 中这个有一个好处就是如果你有一个 Object,并且不会修改,使用 Object.freeze() 可以让性能大幅提升。...现在距离我第一次读这本书,已经过去 6 年了,每当工作中非常非常沮丧的时候,就拿出来读一读,也就没那么沮丧了。 刚好今天又遇到很沮丧的事情,拿出来翻一翻,似乎真的没那么沮丧了,希望在明天。

    37710

    吐槽一下 Vue3 的语法设计

    但是偏偏 Vue3 的语法设计就没这么讲究,于是我的语义化思维,在我学习和使用响应式数据时给我造成了极大的困扰... 我刚开始在项目中,就偏好于使用 reactive。但是现实很快就把我的偏好捏碎了。...比如下面这个例子,我将一个列表作为响应性数据定义在 reactive 中 let data = reactive([]) 但是我万万没想到的是,这样使用是有问题的。... 但是这个机制就由此就导致了在父组件使用自定义组件时,往子组件传参就变得非常复杂。因为在子组件内部就没办法统一接收属性参数了。...就是当我试图使用静态参数类型传递一个静态对象时,你猜怎么着?传不了! 我只能改成动态的绑定写法,才能正常传递。...我认为的常规逻辑无非就是在父组件中,一个 key=value 的方式传递下去,然后在子组件中通过识别 key 来获得这个 value,但是 Vue 又设计了一个新的思路,重新用了一个宏来处理这个事情 <

    21210

    9 Python 基础: 手把手带你梳理对象、继承与多态知识点

    获取对象信息 当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?...在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的: >>> len('ABC') 3...继承与多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class...在调用类实例方法的时候,尽量把变量视作父类类型,这样,所有子类类型都可以正常被接收; 旧的方式定义Python类允许不从object类继承,但这种编程方式已经严重不推荐使用。...has no attribute 'score' 由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

    1.1K50

    医疗数字阅片-医学影像-Module: Panel-自定义面板-中-es6-Object.defineProperty()定义属性

    在ES6中,由于 Symbol类型的特殊性,用Symbol类型的值来做对象的key与常规的定义或修改不同,而Object.defineProperty 是定义key为Symbol的属性的方法之一。...它们共享以下可选键值(默认值是指在使用 Object.defineProperty() 定义属性时的默认值): configurable当且仅当该属性的 configurable 键值为 true ...创建属性 如果对象中不存在指定的属性,Object.defineProperty() 会创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。...当属性不可配置时,不能在数据和访问器属性类型之间切换。 当试图改变不可配置属性(除了 value 和 writable 属性之外)的值时,会抛出TypeError,除非当前值和新值相同。...arc.temperature = 11; arc.temperature = 13; arc.getArchive(); // [{ val: 11 }, { val: 13 }] 下面这个例子中,getter

    66840

    Python基础 | 新手学Python时常见的语法错误和异常

    语法错误又称解析错误,是我们在刚接触学习Python 时最容易遇到的错误,区区别于异常而言,语法错误非程序执行时的逻辑错误; 即使语句或表达式在语法上是正确的,但在尝试执行时,它仍可能会引发错误,而这个在执行时检测到的逻辑错误被称为异常...错误是由箭头指示的位置 上面 的 token 引起的(或者至少是在这里被检测出的):在示例中,在 print() 这个函数中检测到了错误,因为在它前面少了个冒号 (':') 。...另外,我们在初学的时候,容易出现对变量名拼写错误,导致自以为已经定义但是依旧出现这个报错的情况:比如定义var=2,实际使用的时候是1+war的情况。...ImportError:当我们试图引入不存在的库时,并且当 from ... import 中的 "from list" 存在无法找到的名称时 In [16]: from os import x Traceback...我们使用 Control+C 或 Delete时,就会出现中断程序的提示,我常常在程序执行过程中想复制部分打印信息的时候错使用 Control+C想着复制却使得程序中断的情况。

    7.1K41

    Python学习笔记(七)·面向对象高级编程

    has no attribute 'score' 由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。...7.5 使用枚举类 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ......metaclass,直译为元类,简单的解释就是: 当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。 但是如果我们想创建出类呢?...MyList(list, metaclass=ListMetaclass): pass 当我们传入关键字参数metaclass时,魔术就生效了,它指示Python解释器在创建MyList时,要通过...class User(Model)时,Python解释器首先在当前类User的定义中查找metaclass,如果没有找到,就继续在父类Model中查找metaclass,找到了,就使用Model中定义的

    53220

    Kotlin —— 这次入门就不用放弃了

    其他 单例 首先说说单例的实现方式,在之后的实战中,将会经常接触到object这个关键字。...所以当使用Gson.fromJson(String json , Class classOf)方法时,虽然传入了类型参数,当实际上这个T仍然是个Object。...而使用Kotlin后 ? 可能有人注意到了,还是需要findViewById啊!!骗子!说好的优雅呢?完全没觉得更加简洁啊!!...我列举了一些我不喜欢的部分。 1. 没有命名空间 Kotlin 允许你在文件中定义顶级的函数和属性,但是这会带来困扰——所有从 Kotlin 引用的顶级声明无法区分。...那当我每调用一个函数(不管是标准库函数,第三方库函数,还是队友写的函数,甚至我自己写的函数),我都会疑惑这个函数是否会抛出异常。

    1.7K30

    python简明笔记

    Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也“一网打尽”。...可以直接在class中定义属性,这种属性是类属性,归Student类所有: class Student(object): name = 'Student' 当我们定义了一个类属性后,这个属性虽然归类所有...__call__ 一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能直接在实例本身上调用呢?在Python中,答案是肯定的。...本节介绍的是最常用的几个定制方法,还有很多可定制的方法,请参考Python的官方文档 使用枚举 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR...class User(Model)时,Python解释器首先在当前类User的定义中查找metaclass,如果没有找到,就继续在父类Model中查找metaclass,找到了,就使用Model中定义的

    2.2K90

    里式替换原则——面向对象程序设计原则

    程序运行正确性的保证,即类的扩展不会给系统带来新的错误,降低了出错的可能性。因为子类重写了父类方法,在使用多态特性时,程序可能会出现不可预知的错误。...实践 在英雄联盟中,每个英雄到了6级都会拥有大招,大招的效果随着英雄等级提升而提升,盲僧的大招有伤害,杰斯的大招只是切换形态,没有伤害。...我们在杰斯类中覆盖了父类的方法,导致调用getrDPS()方法出现了意料之外的错误。...,重写了父类的setClas(int clas)方法没有为clas赋值,故而在计算R技能伤害时发生了除零异常。...R技能的伤害为1389.5 虽然我到6了,但咱大招么得伤害呀,就不用传值等级了,反正也没用 Exception in thread "main" java.lang.ArithmeticException

    50810

    Java GetterSetter “防坑指南”

    Getter/Setter 在 Java 中被广泛使用,看似简单,但并非每个 Java 开发人员都能很好理解并正确实现 Getter/Setter 方法。...因此,在这篇文章里,我想深入讨论 Java 中的 getter 和 setter 方法,请跟随我一起来看看吧。 一个简单的例子 下面的代码展示了 Getter/Setter 方法的基本使用。.../Setter 的常见错误实现 错误一:实现了 Getter/Setter 方法,但变量不做严格的范围限制 如以下代码片段所示: public String name; // 使用public修饰 public...实现基本类型的 Getter/Setter 方法 在 Java 中,基本类型有 int, float, double, boolean, char......将原始集合中的克隆项添加到新集合中。 自定义对象的 Getter/Setter 方法 如果定义对象的自定义类型,则应针对自己的类型实现 clone() 方法。

    1.3K40

    为什么要用Getter和Setter方法,而不是公开属性

    当我在Java语言编程中开始我的职业生涯时,我就对Getter和Setter感到困惑。为什么要这么写呢?为什么不直接用Public呢?这对我来说是个奇怪的语法。 ?...慢慢地,我意识到了为什么我们使用Getter和Setter,以及为什么它们是重要的。使用Public属性与通过Getter和Setter公开它的主要区别在于保持对该属性的控制。...如果出现任何错误,Setter将不会将该值传递给类成员字段。读了解释之后,我知道你还有一个问题。 我理解,但一般来说,我们不写任何东西在Getter和Setter。...为了回答这个问题,我说通过编写Getter和Setter,我们创建了一个用于将来添加任何验证方法的条款,目前,没有验证,但是如果将来出现任何错误,我们只是在Setter中添加验证逻辑。...这就像当有人试图使他们的代码基础更加通用,适应于任何变化。虽然他/她所想到的大部分变化永远不会到来。因此,Getter和Setter不会使代码复杂,这将在你的代码中得到验证。

    2.2K10

    记录面试中一些回答不够好的题(Vue 居多)

    组件共享 data 属性,当 data 的值是同一个引用类型的值时,改变其中一个会影响其他。 Vue computed 实现 这个题目有两家问了,感觉都不是答得很好。...每个属性提供的函数作为属性的 getter,使用 Object.defineProperty 转化。 Object.defineProperty getter 依赖收集。...有兴趣的同学可以参考这个: http://www.cnblogs.com/dolphin0520/p/3749259.html 。 ps: 看来我得补补数据结构和算法相关的知识了。...有个面试官问我,在 electron 怎么解决跨域问题? 在我自己的项目里,确实遇到了这个问题,可惜选择了一个不怎么好的方法的方法,设置 nginx 。...- - 也聊到了使用 CORS 允许跨域,也觉得不好,因为需要后端接口处理。 一脸懵逼的我,直到面试官提醒使用 node 来代理以下,才恍然大悟。(原来还可以这种操作。。。。)

    1K20

    【TypeScript 演化史 -- 9】object 类型 和 字符串索引签名类型的点属性

    在TypeScript附带的lib.es6.d.ts文件中,Object类型定义如下: interface Object { // ... /** Returns a string representation...当咱们试图访问此类对象上的任意属性时,TypeScript 会提示编译时错误 // Type {} const obj = {}; // Error: 类型“{}”上不存在属性“prop” obj.prop...在类型使用上使用.符号访问未知属性仍然是一个错误,因此,对于以下代码,TypeScript 2.2 仍然会给出一个编译时错误: const portNumbers = {}; // OK portNumbers...在 JS 中访问属性时,大多数时候将使用点表示法,但也可以使用括号表示法作为转义。 有了这个较松的限制,对于常用JS 开发的人员来说更容易使用。...我是小智,对前端技术保持学习爱好者。我会经常分享自己所学所看的干货,在进阶的路上,共勉!

    1.3K10

    Geekpwn 2020云端挑战赛 Noxss & umsg

    前两天看了今年Geekpwn 2020 云端挑战赛,web题目涉及到了几个新时代前端特殊技巧,可能在实战中利用起来难度比较大,但是从原理上又很符合真实世界的逻辑,这里我们主要以解释题目为主,但是也探索一下在真实场景下的利用...众所周知,前端涉及到读取内容就逃不开同源策略,事实证明,我们没有任何办法在不使用0day的情况下获得跨源站点下的内容,那么我们不妨去探索一下这个场景的特殊性。...当我们在firefox中试图加载页面时,firefox会毫不留情的拦截返回并且不会有任何处理区别。但是在chrome中就有区别了。...在NU1L的Wp中还用了win1.frames.length去取open窗口的内的frames数量,这个利用方式涉及到前面提到的第二点,主要是利用了搜索不到内容时,页面会多出来的iframe标签来做判断...这个问题最早我是在最后一届乌云大会上听#呆子不开口分享的议题中看到了。

    51730
    领券