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

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

,但是调用的过程不一样(虽然其实也就是多一个括号而已),那么有没有一种办法,使得我们调用属性的时候就会自动调用相应的方法,也就是增加一些额外的处理过程(例如类型检查或者验证)。...('Can not delete the name') AttributeError: Can not delete the name 正如例子中这样。...上面例子中的两种写法,一般倾向于第二种写法,特别是如果需要对某个普通的属性额外增加处理步骤时,可以在不修改已有代码的情况下将这个属性提升为一个property。...do not need (): c.area instead of c.area() print(c.perimeter) 78.53981633974483 31.41592653589793 这样的写法就会使得实例的接口变得统一...个人建议,不要在代码中不断重复使用@property,这样会使得代码变得臃肿,而且难以阅读,容易出错。同样的任务,利用描述符或者闭包也能够很好的完成(以后会详细解释)。

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

    Python 学习笔记之类与实例

    2、组合(composition,has-a)了哪些部件 组合可用来表述该车使用了哪些零部件,比如最新的发动机。 类与模块的不同之处 1、类可生成多个实例。2、类可被继承和扩展。...3、类实例的生命周期可控。4、类支持运算符,可按需重载。 这些特性模块没有或者不需要,同时,模块粒度大,模块可用来提供游戏场景级别的解决方案,而类则是该场景下的特定家族和演员。...其既不接收实例引用,也不参与类型处理,所以就没有自动传入第一参数。使用静态方法,更多原因是将类型作为一个作用域,或者当前类型添加便捷接口。...__ new __:构造方法,创建对象实例 __ init __:初始化方法,设置实例的相关属性 __ del __:析构方法,实例被回收时调用 创建实例时,会先调用析构方法和初始化方法。...五 总结 学习到此,我总算把类的创建,属性和方法等弄清楚了,我最想强调一点,希望读者把 实例 self 参数弄明白,后续编码过程中使用较多。 还要清楚实例方法和静态方法的区别。

    43510

    OOP 三大特性:封装中的 property

    Python 没有像 Java 等某些语言那样,以 public 和 private 等关键词定义类,可以说所有的类都是 pbulic 的,8.7.1节介绍的以命名“私有化”形式实现封装,也不是 Java...为了实现密码只读的需求,使用了注释(1)所示的装饰器 @property ——这个装饰器是基于内置函数 property() ,并且将原来的方法 get_pwd() 更名为 password() (如注释...重新载入 mypassword 模块(参阅8.5.2节,最简单的方法是在交互模式中执行 exit() 函数退出后,在进入交互模式),执行如下操作: >>> from mypassword import...但,注释(4)貌似成功了,其实这也没有修改 laoqi.password 的值,只是为实例 laoqi 增加了一个名为 __password 的实例属性。如此,实现了密码的“只读”功能。...("Can't delete attribute") AttributeError: Can't delete attribute 重点看注释(12)的操作结果,之所抛出异常,是因为在程序中注释(11

    48510

    Python - 描述器

    很多时候我们可能需要对某个实例的属性加上除了修改、访问之外的其他处理逻辑,例如 类型检查、数值校验等,就需要用到描述器 ---《Python Cookbook》 我们可以使用 Python 自带的 property..._age = value 试一试,的确如代码写的一样,对属性的类型进行了检查,而且使用了 property 装饰器之后,对 age 方法的访问和对属性的访问一样,不需要加 () >>> a = Person...__get__ 方法 是通过 __getattribute__ 调用的,实际上,Python 中访问实例属性时,__getattribute__ 就会被调用,__getattribute__ 会查找整个继承链...,直到找到属性,如果没有找到属性,但是定义了 __getattr__ ,那么就会调用 __getattr__ 去查找属性,否则抛出 AttributeError __getattribute__ 的代码用...,如果实例字典中有与描述器同名的属性,如果是资料描述器,则优先使用资料描述器,否则使用实例字典中的属性 class AbsPriorityDescriptor: def __init__(self

    88930

    Python @property

    prerequisite: Python装饰器 在面向对象编程中,我们通常希望一个类的属性具有一定程度的封装性,其他对象只能通过定义好的接口访问这些属性,而不能够随意修改。...在Python中如果我们不希望类的方法被修改,可以使用@Property装饰器。它可以修饰方法,将该被修饰的方法转为相同名称的只读属性;也可以与属性配合使用,来防止属性被修改。...即@Property装饰器常见使用场景有两个: 将方法转化为同名属性 与类的属性配合使用,防止属性被修改 将方法转化为同名属性 class Data: @property def printnum_with_property...,不能在通过对象名.方法名()访问到,只能是使用访问属性的方法即对象名.方法名来访问。..._count中的下划线可以不加,语法上也没有错误,但这种写法强调来_count是类的一个固有属性,是推荐写法。

    43310

    【Python基础】Python3十大经典错误及解决办法

    9# Python将变量s视为一个本地的局部变量,但该变量未初始化。 解决方法: 在函数内使用全局变量时,使用global关键字对其进行声明即可。...八、 AttributeError 属性错误 报错信息: 1AttributeError: 'tuple' object has no attribute 'append' 2AttributeError...错误示例2: 1df = pd.read_excel(r'data.xlsx') 2df.col 3# 错误原因:DataFrame没有col属性,应该为columns。...解决方法: 正确书写类的属性名,不要发生书写错误。深刻理解元祖,列表的区别,可将元祖转换为列表添加元素。...解决方法: 这种报错常见于两种场景中,第一、未下载、安装该模块;第二、将调用的模块路径与被调用的模块路径不一致等。

    1.8K30

    一文教你读懂 Python 中的异常信息

    AttributeError 当你访问一个对象的属性,但是这个属性并没有在这个对象定义的时候,就会引发 AttributeError。...' object has no attribute 'b' AttributeError 的错误消息行告诉我们特定对象类型(在本例中为 int)没有访问的属性, 在这个例子中属性为 b。...ImportError 在使用 import 导入模块时,如果要导入的模块找不到,或者从模块中导入模块中不存在的内容。...import 导入一个不存在的模块时,就会出现 ModuleNotFoundError 的错误,Traceback 最下面一句信息给出了原因, 没有名为 aaa 的模块....并没有太多的内容,但是,结合上面的错误信息,就可以解决这个问题。 NameError 当你引用了变量、模块、类、函数或代码中没有定义的其他名称时,将引发 NameError。

    2.6K10

    【Python基础】Python3十大经典错误及解决办法

    9# Python将变量s视为一个本地的局部变量,但该变量未初始化。  解决方法:在函数内使用全局变量时,使用global关键字对其进行声明即可。  ...八、 AttributeError 属性错误  报错信息:  1AttributeError: 'tuple' object has no attribute 'append' 2AttributeError...错误示例2:  1df = pd.read_excel(r'data.xlsx') 2df.col 3# 错误原因:DataFrame没有col属性,应该为columns。  ...解决方法:正确书写类的属性名,不要发生书写错误。深刻理解元祖,列表的区别,可将元祖转换为列表添加元素。  ...解决方法:这种报错常见于两种场景中,第一、未下载、安装该模块;第二、将调用的模块路径与被调用的模块路径不一致等。

    2.1K30

    《流畅的Python》第十章学习笔记

    把协议当作正式接口 repr reprlib.repr用于生成大型结构或递归结构的安全表示形式。 它会限制输出字符串的长度,用「…」表示截断的部分。...注意:调用__repr__函数的目的是调试,因此绝对不能抛出异常,尽量输出有用的内容,让用户能够识别目标对象。 协议 在面向对象编程中,协议是非正式的接口,只在文档中定义,在代码中不定义。...协议是非正式的,没有强制力,因此如果知道类的具体使用场景,通常只需要实现一个协议的部分。...切片对象具有仅会返回对应参数值(或其默认值)的只读数据属性 start, stop 和 step。它们没有其他的显式功能;不过它们会被 NumPy 以及其他第三方扩展所使用。...切片对象也会在使用扩展索引语法时被生成。例如: a[start:stop:step] 或 a[start:stop, i]。

    32120

    Python中的内置异常你知道那些,欢迎留言评论~~~

    可以使用local()内置函数来查看这些内置异常,如下所示: >>> locals()['__ builtins__'] 这将返回内置异常,函数和属性的字典。...此类负责使用传递的参数使用str()创建异常的字符串表示形式。如果没有参数,则返回一个空字符串。 args: args是提供给异常构造函数的参数的元组。...当属性引用或分配失败(例如,引用了不存在的属性)时,将引发AttributeError。...,当找不到模块时,import会引发该子类。...当解释器检测到超过最大递归深度时,将引发此异常。 异常ReferenceError 当在垃圾回收之后使用弱引用代理访问引用对象的属性时,引发ReferenceError。

    2.9K10

    【Python】已解决报错:AttributeError: module ‘json‘ has no attribute ‘loads‘解决办法

    但是运行了如下代码的时候,它竟然提示:AttributeError: module ‘json’ has no attribute ‘loads’,翻译成汉语的意思是:属性错误:json模块中没有loads...然而,在使用json模块时,开发者可能会遇到AttributeError: module ‘json’ has no attribute 'loads’的错误。...这意味着在尝试使用一个不存在的属性或方法。 二、可能的错误原因 错误的模块名称 可能是我们错误地引用了json模块。...模块时,使用了错误的导入方式。...所以以后需要注意以下几点: 确保在导入模块时使用正确的模块名,避免使用错误的模块或拼写错误。 在调用模块属性或方法时,使用正确的属性或方法名,避免拼写错误。

    28510

    特性(property)

    6.4 特性(property) 1 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 import math class Circle:...  注意:此时的特性arear和perimeter不能被赋值 c.area=3 #为特性area赋值 ''' 抛出异常: AttributeError: can't set attribute '''...2 为什么要用property 将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则 除此之外...不说“女儿”,就像“parent”本来是“父母”的意思,但中文都是叫“父类”)公开 【private】 这种封装对谁都不公开 python并没有在语法上把它们三个内建到自己的class机制中,在C++...里一般会将所有的所有的数据都设置为私有的,然后提供set和get方法(接口)去设置和获取,在python中通过property方法可以实现 class Foo: def __init__(self

    75930

    python json.loads 中文_Python 的完美 json loads

    为了对付表单提交时参数多和 json 结构复杂的情况,我写了一个名为 recursive_json_loads 的处理函数来对请求对象递归调用 json.loads() 以期能够一次性将所有参数转化为更好用的...self[key] 改成 self.get(k),从而避免在访问不存在的值时触发属性异常。...k=0) 有一点需要注意的是,对于传了参数而没有传值的情况(?k=),k 的值会是 ”,而且 isinstance(”, str) 会返回 True。...= ” and not isinstance(data.k, int): return error() 因为 Python 会把很多种如 len() 为零的对象的布尔值判断为 False,所以上面始终没有使用...补充,Storage 类的一个缺点是:他有 __dict__ 属性,但该属性永远为空 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    77820
    领券