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

python学习笔记6.3-类的属性函数(@property)

属性函数(@property) 在对象中两个很重要的元素就是属性和方法,在调用的时候两者是有区别的。...),那么有没有一种办法,使得我们调用属性的时候就会自动调用相应的方法,也就是增加一些额外的处理过程(例如类型检查或者验证)。...要定义对属性的访问,一种最简单的方法就是将其定义property。...line 55, in name raise TypeError('name must is string type') TypeError: name must is string type 当我们实现一个...上面例子中的两种写法,一般倾向于第二种写法,特别是如果需要对某个普通的属性额外增加处理步骤,可以在不修改已有代码的情况下将这个属性提升为一个property。

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

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

7.1 使用 __slots__ 正常情况下,当我们定义了一个 class,创建了一个 class 的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。...' 由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError错误。...7.4.5 __call__ 一个对象实例可以有自己的属性和方法,当我们调用实例方法,我们用instance.method()来调用。能不能直接在实例本身上调用呢?...7.5 使用枚举类 当我们需要定义常量一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ......class User(Model),Python解释器首先在当前类User的定义中查找metaclass,如果没有找到,就继续在父类Model中查找metaclass,找到了,就使用Model中定义的

47920

【已解决】Python 中 AttributeError: ‘NoneType‘ object has no attribute ‘X‘ 报错

同时欢迎大家关注其他专栏,将分享Web前后端开发、人工智能、机器学习、深度学习从0到1系列文章 一、Bug描述 在Python编程中,AttributeError一个常见的错误,它通常发生在尝试访问一个对象属性或方法...特别地,AttributeError: ‘NoneType’ object has no attribute 'X’这个错误表明我们尝试访问的属性X属于一个None类型的对象。...None,没有属性x 原因二:错误的变量初始化 在某些情况下,变量可能没有被正确初始化,或者被错误地设置None。...错误示例: obj = None print(obj.x) # 引发AttributeError 原因三:异常处理不当 在处理可能抛出异常的代码,如果没有正确捕获异常,并且在异常发生后尝试访问对象属性...:正确的类型检查 在访问属性之前,使用is not None来检查对象是否None。

76120

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

有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量,意思就是,“虽然可以被访问,但是,请把视为私有变量,不要随意访问...总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。 获取对象信息 当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?...dir() 如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法: >>> dir('ABC') ['__add__',...True >>> getattr(obj, 'y') # 获取属性'y' 19 >>> obj.y # 获取属性'y' 19 如果试图获取不存在的属性,会抛出AttributeError错误: >>>...score将得到AttributeError错误

1K50

Day10面向对象高级编程13

使用slots 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。...__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError错误。...,使用它的时候编译器会判断_是否空,空的话自动实例化。..._是对实例变量的访问,我们没有实例化它,不能使用。 对类里局部变量访问使用_,外部变量则用self.。 在getter方法中,不要再使用self。否则会重复调用getter方法,造成死循环。...正常情况下,把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是

79750

python简明笔记

有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量,意思就是,“虽然可以被访问,但是,请把视为私有变量,不要随意访问...'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError错误。...__getattr__ 正常情况下,当我们调用类的方法或属性,如果不存在,就会报错。...__call__ 一个对象实例可以有自己的属性和方法,当我们调用实例方法,我们用instance.method()来调用。能不能直接在实例本身上调用呢?在Python中,答案是肯定的。...class User(Model),Python解释器首先在当前类User的定义中查找metaclass,如果没有找到,就继续在父类Model中查找metaclass,找到了,就使用Model中定义的

2.1K90

Python之面向对象高级编程

Python之面向对象高级编程 01 使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是Python的灵活性,...' 但是在实际应用中,往往会出现这样的需求,就是我们在一开始定义类的时候,并没有想清楚这个类到底需要那些方法和属性,在不断的迭代使用中,我们想给已经定义的类添加一个方法,以使得所有的实例都可以调用这个方法...没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttrbuteError的错误。...02 使用@property 在绑定属性,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改,如下: s = Student() s.score = 9999...把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作

35210

这也许是你会遇到的Google Chrome Bug

Getter/Setter 在 JavaScript 定义对象,我们同时可以通过 [[Getter]]、[[Setter]] 来属性绑定对应的执行函数。...在之后我们通过 child.name = '19Qingfeng' 尝试 child 实例添加一个 name 属性 19Qingfeng。...最开始也是天真的这样以为的,当我们进行 child.name = '19Qingfeng' 赋值,应该仅仅为 child 实例上添加一个 name 19Qingfeng 的属性就可以了。...其实这正是想和大家重点强调的的所谓 Getter/Setter 产生的屏蔽效应: 比如上边我们 child 的 name 属性进行赋值操作完整过程如下: 如果 child 对象中包含名为 name...不过这一切已经显得不是那么重要的,重要的是之前已经和大家讲述过的结论。 当我一个对象进行赋值操作,并不是仅仅会直接实例上进行赋值操作,不同情况下会存在截然不同的效果。

34010

流畅的 Python 第二版(GPT 重译)(十二)

实现__getattr__的用户定义类可以实现称之为虚拟属性的动态属性变体:这些属性在类的源代码中没有明确声明,也不在实例__dict__中存在,但可能在用户尝试读取不存在的属性在其他地方检索或在需要动态计算...示例 22-3 的最后一行揭示了的代码存在一个小问题:尝试读取一个不存在的属性应该引发AttributeError,而不是显示的KeyError。...当我实现错误处理,__getattr__方法变得两倍长,分散了想展示的最重要的逻辑。考虑到用户会知道FrozenJSON是由映射和列表构建的,认为KeyError并不会太令人困惑。...记住保罗·格雷厄姆在第十七章中的引用:“当我的程序中看到模式认为这是一个麻烦的迹象。”重复的治疗方法是抽象。有两种抽象属性定义的方法:使用属性工厂或描述符类。...只读属性的__set__方法应该只是引发AttributeError并附带适当的消息

10310

Python - 面向对象编程 - @property

getter、setter 方法 不破坏类封装原则的基础上,操作实例属性 写过 java 的话应该知道,java 的类可以自动生成对属性的操作方法,一个是 get,另一个是 set(一般称为 getter...# 输出结果 小菠萝 新的小菠萝 这样跟 java 的写法就差不多了,但还是有点麻烦 property() 方法的诞生 可以实现在不破坏类封装原则的前提下,让开发者依旧使用 对例对象.属性 的方式操作类中的属性...是一个装饰器,相当于 getter 装饰器 可以使用 @property 来创建只读属性,将一个实例方法变成一个相同名称的只读实例属性,这样可以防止属性被修改 代码栗子 # @property class...: can't set attribute name 是一个只读属性,不可写,相当于 __name 私有属性只有 getter 方法,没有 setter 方法 等价写法 class PoloBlog:...加了 @property 的方法相当于一个实例属性,所以不能和其他实例属性重名 错误代码栗子 class A: def __init__(self): # 已经定义了 name

28320

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

当我在Java语言编程中开始的职业生涯就对Getter和Setter感到困惑。为什么要这么写呢?为什么不直接用Public呢?这对来说是个奇怪的语法。 ?...那么,下面属性name和value的区别是什么呢? ? 慢慢地,意识到了为什么我们使用Getter和Setter,以及为什么它们是重要的。...例如,可以将字段设置空值,如果在另一个方法中使用该字段,则该方法可能会因空指针异常而崩溃。 但是,如果你提供了一个Getter和Setter,你可以在完全控制的同时提供间接访问。...为了回答这个问题,说通过编写Getter和Setter,我们创建了一个用于将来添加任何验证方法的条款,目前,没有验证,但是如果将来出现任何错误,我们只是在Setter中添加验证逻辑。...但是,当一个字段没有这样的验证约束,为什么要麻烦写一个Getter和Setter可以简单地公开它。 根据我的理解,问题的症结在于避免使代码变得不必要的复杂。

2.1K10

彻底搞懂Object.defineProperty

例如: Person.age = 1; console.log(Person.age);// '少年' 在印象里JavaScript对象是可以用getter与setter来解决这个问题的,存一个数字进去...昨天,在通读vue文档过程中,一篇名为深入响应式原理吸引了的注意,文中简述了vue数据响应式的原理,以及在操作数组与对象需要注意的点,在实现上vue也使用了Object.defineProperty...o['age'] = 27; 一个很直观的感受就是,对象赋值就是种瓜瓜种豆豆,我们给对象赋予了什么,获取的就是什么。...那大家有没有想过这种情况,赋值提供1,但取值希望是2。巧了,这种情况我们就可以使用Object.defineProperty()中的存取描述符来解决这个需求。...setter函数在设置属性触发,同理你这个属性提前定义这个方法才行,设置的值将作为参数传入到setter函数中,在这里我们可以加工数据,若未定义此方法默认也是undefined。

1.6K20

Python内置(4)类相关的内置

现在第二个object也没有指向它的东西,所以也将被垃圾收集丢掉。 为了能够验证所有这些,我们可以使用内置函数id。id 获得对象在内存中的确切位置,表示数字。...既然已经提到了继承,想我也应该详细说明“方法解析顺序(method resolution order,MRO)”是如何工作的。 简而言之,MRO 是对象从中继承属性和方法的类的列表。...property @property是当您要为对象中的属性定义获取器(getter)和设置器(setter)使用的修饰符。...getters 和 setter 提供了一种在尝试读取或修改对象属性添加验证或运行一些额外代码的方法。...这是通过将属性转换为一组函数来完成的:一个函数在您尝试访问属性时运行,另一个函数在您尝试更改其值时运行。

2.4K30

彻底搞懂 Object.defineProperty

例如: Person.age = 1; console.log(Person.age);// '少年' 在印象里JavaScript对象是可以用getter与setter来解决这个问题的,存一个数字进去...昨天,在通读vue文档过程中,一篇名为深入响应式原理吸引了的注意,文中简述了vue数据响应式的原理,以及在操作数组与对象需要注意的点,在实现上vue也使用了Object.defineProperty...o['age'] = 27; 一个很直观的感受就是,对象赋值就是种瓜瓜种豆豆,我们给对象赋予了什么,获取的就是什么。...那大家有没有想过这种情况,赋值提供1,但取值希望是2。巧了,这种情况我们就可以使用Object.defineProperty()中的存取描述符来解决这个需求。...setter函数在设置属性触发,同理你这个属性提前定义这个方法才行,设置的值将作为参数传入到setter函数中,在这里我们可以加工数据,若未定义此方法默认也是undefined。

76920

面向对象编程进阶

,说是eat需要一个self参数,但调用时却没有传递,没错,当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了。...", line 58, in f.flight_status = 2 AttributeError: can't set attribute 当然可以改, 不过需要通过@proerty.setter...__init__ 构造方法,通过类创建对象,自动触发执行。 4.__del__  析构方法,当对象在内存中被释放,自动触发执行。...注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收自动触发执行的...__str__ 如果一个类中定义了__str__方法,那么在打印 对象 ,默认输出该方法的返回值。

77920

Python3中的特性-----Property介绍

在不改变类接口的前提下使用存取方法 (即读值和取值) 来修改数据的属性。什么意思呢?就是通过 obj.property 来读取一个值,obj.property = xxx ,来赋值。...防止一些非法值变成对象属性. 比如说name 应该是这个字符串, 不应该是数字 这个时候 就可以在 setter 的时候 进行判断,来控制 能否赋值....'bar', 'prop': 'foo'} >>> obj.prop #1 'the prop value' >>> Class.prop ='frank' >>> obj.prop 'foo' 尝试修改...直接修改obj.dict,然后 在#1的地方, 发现 还是正常调用了特性 ,而没有属性的值.当我改变Class.prop变成一个属性的时候 .再次调用obj.prop才调用到了 实例属性....__class__ 开始,而且,仅当类中没有名为 attr 的特性, Python 才会在 obj 实 例中寻找。

73530

高级前端开发者必会的34道Vue面试题系列(二)

但是当给name属性赋值对象类型后,再给新对象里插入key1一个属性后,接着改变这个key1的值,这时候页面并不能得到响应式触发。...2、检测属性对象类型 从上面的例子里,检测属性对象,不能满足监听需求,接下来进一步改造observe监听函数,解决思路很简单,如果是对象,只需再一次将当前对象下的所有普通类型的监听变化即可,如果该对象下还有对象属性...在上面的实际操作中,先改变了属性name的值,触发了setter,页面收到响应,再次改变了model.data这个对象下的val属性,页面也得到响应式变化,这说明我们在之前是想observe监听不到对象属性变化的问题在上面的改造下得到了解决...接下来要注意,在最后改变了数组属性list下的第一个下标里的值5,页面也得到了监听结果,但是改变了第二个下标后,没有触发setter,接着特意去改变list的length,或者push都没有触发数组的...3、检测属性数组对象类型 这里分析一下a问题修改数组下标的值和调用length、push方法改变数组不触发监听器的setter函数的原因。

98130

Python 从attribute到property详解

Google了好几下, 找到了一个看起来比较靠谱的解释: According to Webster, a property is a characteristic that belongs to a...属性值合法性验证 在上面的例子中, foo.name只有getter方法, 是只读的, 但其实property也是可修改的, 只需要为它添加一个setter方法就行了....一种解决方案是按照Java风格, 实现一个Java式的setter方法, 通过item.set_price(price)设置price属性, 然后在set_price方法里写验证代码....item.count = 2 print(item.price) 但下面的语句执行时便会报错了: item = Item('Bread', 1, -10) # or item.price = -10 会报出同一个错误...通过class Foo访问Foo.name得到的是property对象, 而非property值. 2. 访问 foo.name返回的是Foo.name的property值.

1.4K30

34道Vue面试题系列:Vue中如何检测数组变化?

但是当给name属性赋值对象类型后,再给新对象里插入key1一个属性后,接着改变这个key1的值,这时候页面并不能得到响应式触发。...2、检测属性对象类型 从上面的例子里,检测属性对象,不能满足监听需求,接下来进一步改造observe监听函数,解决思路很简单,如果是对象,只需再一次将当前对象下的所有普通类型的监听变化即可,如果该对象下还有对象属性...在上面的实际操作中,先改变了属性name的值,触发了setter,页面收到响应,再次改变了model.data这个对象下的val属性,页面也得到响应式变化,这说明我们在之前是想observe监听不到对象属性变化的问题在上面的改造下得到了解决...接下来要注意,在最后改变了数组属性list下的第一个下标里的值5,页面也得到了监听结果,但是改变了第二个下标后,没有触发setter,接着特意去改变list的length,或者push都没有触发数组的...3、检测属性数组对象类型 这里分析一下a问题修改数组下标的值和调用length、push方法改变数组不触发监听器的setter函数的原因。

2.7K60
领券