1. 无论是类还是实例,一切皆是对象。
  2. Python是强动态语言,和java在这点上有所不同。
class Ab():
a = 666 # 定义类对象Ab,自带属性a,值为666
# 使用Ab.__dict__可以查看类Ab的属性 us1 = Ab()
us2 = Ab() # 定义两个实例对象us1、us2,这两个实例自身并不具备任何属性
# 只有在__init__中定义了self.arg=xxx的情况下,实例默认会具备arg属性
  1. 动态语言中,属性自带操作方法:获取(读)、设置(写);还可以定义删除
print(Ab.a, us1.a, us2.a)

# 获取属性a,输出均为666
# 属性查找机制:自下而上。
# python查找对象us1不具备属性a,就会在其所属的类对象Ab中查找属性a。 us1.a += 333 # 输出999
# 首先查找us1.a未找到,于是使用Ab.a
# 然后设置Ab.a+333的值为us1.a属性的值 Ab.a += 222 # 输出888 print(Ab.a, us1.a, us2.a) # 输出分别为888,999, 888
# us1已具备属性a,值为999.所以不再类中查找
# us2不具备属性a,所以使用类Ab.a的值

@property

将类的方法变为属性

  1. 原因:

不使用方法限制属性,则属性可以随意读写;

使用方法限制读写,则读写比较麻烦(要调用三个方法:get、set、del)

  1. 解决方法:装饰器property

将方法转化为属性,即方便调用,又防止随意更改。

  1. 示例
class Student(object):

    @property
def score(self):
'''
原本定义为get_score()
调用方法:xiaopang.get_score()
如今调用属性score:xiaopang.score
'''
return self._score @score.setter
def score(self, value):
'''
原本定义为set_score()
调用方法:xiaopang.set_score(80)
如今调用属性score:xiaopang.score = 80
'''
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
  1. property原理
  • 并没有直接暴露属性,而是通过property的getter、setter方法进行参数传递
  • dir(property)查看到还有deleter方法,如果只有getter(默认),没有setter,则属性为只读

python学习之类和实例的属性;装饰器@property的更多相关文章

  1. 流畅的python学习笔记第七章:装饰器

    装饰器就如名字一样,对某样事物进行装饰过后然后返回一个新的事物.就好比一个毛坯房,经过装修后,变成了精装房,但是房子还是同样的房子,但是模样变了. 我们首先来看一个函数.加入我要求出函数的运行时间.一 ...

  2. 老男孩python学习自修第十七天【装饰器】

    装饰器:在某个方法执行前后去执行其他新定义的行为 例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ def before_say_hello(): pr ...

  3. python学习 day12 (3月18日)----(装饰器内置函数)

    读时间函数: # import time # def func(): # start_time = time.time() # 代码运行之前的时间 # print('这是一个func函数') # ti ...

  4. python 描述符 上下文管理协议 类装饰器 property metaclass

    1.描述符 #!/usr/bin/python env # coding=utf-8 # 数据描述符__get__ __set__ __delete__ ''' 描述符总结 描述符是可以实现大部分py ...

  5. python基础语法16 面向对象3 组合,封装,访问限制机制,内置装饰器property

    组合: 夺命三问: 1.什么是组合? 组合指的是一个对象中,包含另一个或多个对象. 2.为什么要用组合? 减少代码的冗余. 3.如何使用组合? 耦合度: 耦: 莲藕 ---> 藕断丝连 - 耦合 ...

  6. TypeScript学习笔记(九):装饰器(Decorators)

    装饰器简介 装饰器(Decorators)为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式. 需要注意的是:装饰器是一项实验性特性,在未来的版本中可能会发生改变. 若要启用实验性的装饰器特 ...

  7. python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器

    1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...

  8. typescript装饰器定义 类装饰器 属性装饰器 装饰器工厂

    /* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...

  9. Python的高级特性7:闭包和装饰器

    本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...

随机推荐

  1. 排序算法之堆排序(Heapsort)解析

    一.堆排序的优缺点(pros and cons) (还是简单的说说这个,毕竟没有必要浪费时间去理解一个糟糕的的算法) 优点: 堆排序的效率与快排.归并相同,都达到了基于比较的排序算法效率的峰值(时间复 ...

  2. MessageBox实现自动延时关闭

    1,首先新建一个winform窗体:MessageForm,设置StartPosition属性为Manual,Location属性值-500, -500 主要是为了让MessageForm窗体不显示在 ...

  3. WPF 自定义下拉列表

    XAML代码: <Popup x:Name="popupStrategy" StaysOpen="False" PopupAnimation=" ...

  4. hashlib 和loggin模块

    1.摘要算法hashlib 1. md5加密 #1. 摘要算法 #md5加密算法 32位 import hashlib username ="alex" md5_obj =hash ...

  5. 20164317《网络对抗技术》Exp3 免杀原理与实践

    一.实验要求 1.1 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分),veil-evasion(0.5分),加壳工具(0.5分),使用shellcode编程( ...

  6. python小数的进位与舍去

    一.基础知识准备 ​ 奇进偶舍,又称为四舍六入五成双规则.银行进位法(Banker's Rounding),是一种计数保留法,是一种数值修约规则.从统计学的角度,"奇进偶舍"比&q ...

  7. 838. Push Dominoes

    There are N dominoes in a line, and we place each domino vertically upright. In the beginning, we si ...

  8. TP5使用Composer安装phpoffice/phpspreadsheet,导出Excel文件

    1.composer安装: composer require phpoffice/phpspreadsheet 2.点击导出按钮,触发控制器里面的方法 wdjzdc() 3. 在控制中引入 use P ...

  9. 萝卜保卫战3内购破解+Toast窗口增加(Love版)

    涉及到一些不同的破解的方法,以及不同的破解思路,还有一些重要权限的删除等. 作者:HAI_ 这次目标是经常玩的萝卜保卫战,不知不觉,已经更新到3了.详细分析请参考https://bbs.ichunqi ...

  10. 2 rocketmq mqadmin 的用法详解

    参考文档 http://jameswxx.iteye.com/blog/2091971 1.1. 控制台使用 RocketMQ 提供有控制台及一系列控制台命令,用于管理员对主题,集群,broker 等 ...